TOP101题解 | BM54#三数之和#
三数之和
https://www.nowcoder.com/practice/345e2ed5f81d4017bbb8cc6055b0b711
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
* @author Senky
* @date 2023.08.26
* @par url https://www.nowcoder.com/creation/manager/content/584337070?type=column&status=-1
* @brief 三重for循环可以解决但是太低效
* @param num int整型一维数组
* @param numLen int num数组长度
* @return int整型二维数组
* @return int* returnSize 返回数组行数
* @return int** returnColumnSizes 返回数组列数
*/
#include <stdlib.h>
int compar(const void* p1, const void* p2)
{
return (*(int*)p1 - *(int*)p2);
}
int** threeSum(int* num, int numLen, int* returnSize, int** returnColumnSizes )
{
// write code here
qsort(num, numLen, sizeof(num[0]), compar);
int** result = (int**)malloc(sizeof(int*) * numLen * numLen);
*returnSize = 0;
*returnColumnSizes = (int*)malloc(sizeof(int) * numLen * numLen);
for(int i = 0; i < numLen; i++)
{
if(i > 0 && num[i] == num[i - 1])
{
continue;
}
int target = -num[i];
int left = i + 1;
int right = numLen - 1;
while (left < right)
{
int sum = num[left] + num[right];
if (sum == target)
{
result[*returnSize] = (int*)malloc(sizeof(int) * 3);
result[*returnSize][0] = num[i];
result[*returnSize][1] = num[left];
result[*returnSize][2] = num[right];
(*returnColumnSizes)[*returnSize] = 3;
(*returnSize)++;
while (left < right && num[left] == num[left + 1])
{
left++; // Skip duplicates
}
while (left < right && num[right] == num[right - 1])
{
right--; // Skip duplicates
}
left++;
right--;
}
else if (sum < target)
{
left++;
}
else
{
right--;
}
}
}
return result;
}
#TOP101#TOP101-BM系列 文章被收录于专栏
系列的题解