题目:
给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有和为 0 且不重复的三元组。
注意:答案中不可以包含重复的三元组。
示例 1:
输入:nums = [-1,0,1,2,-1,-4]
输出:[[-1,-1,2],[-1,0,1]]
示例 2:
输入:nums = []
输出:[]
示例 3:
输入:nums = [0]
输出:[]
提示:
0 <= nums.length <= 3000
-105 <= nums[i] <= 105
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/3sum
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
结果:
解题思路:
固定一个数字之后用双指针挪动。
代码:
/**
* Return an array of arrays of size *returnSize.
* The sizes of the arrays are returned as *returnColumnSizes array.
* Note: Both returned array and *columnSizes array must be malloced, assume caller calls free().
*/
int compare(const void *a, const void *b) {
return *(int *)a - *(int *)b;
}
int** threeSum(int* nums, int numsSize, int* returnSize, int** returnColumnSizes){
qsort(nums, numsSize, sizeof(int), compare);
int **retArr = (int **)malloc(sizeof(int *) * numsSize * numsSize);
*returnColumnSizes = (int *)malloc(sizeof(int) * numsSize * numsSize);
int arrSize = 0;
for (int left = 0; left < numsSize - 2; left++) {
if (left > 0 && nums[left] == nums[left - 1]) {
continue;
}
for (int mid = left + 1, right = numsSize - 1; mid < right && right < numsSize; ) {
//判断和是否为0,如果为0,存储到retArr中
int sum = nums[left] + nums[mid] + nums[right];
if (sum == 0) {
if(arrSize > 0 && nums[left] == retArr[arrSize - 1][0] && nums[mid] == retArr[arrSize - 1][1] && nums[right] == retArr[arrSize - 1][2]) {
mid++;
continue;
}
//printf("sum == 0\n");
// 添加返回值
retArr[arrSize] = (int *)malloc(sizeof(int) * 3);
(*returnColumnSizes)[arrSize] = 3;
retArr[arrSize][0] = nums[left];
retArr[arrSize][1] = nums[mid];
retArr[arrSize][2] = nums[right];
arrSize++;
mid++;
right--;
} else if (sum < 0) {
mid++;
} else {
right--;
}
}
}
* returnSize = arrSize;
return retArr;
}