给定一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?找出所有满足条件且不重复的三元组。
注意:答案中不可以包含重复的三元组。
自己闲时实现了一份代码上传的时候一直报错,没找到什么原因,做个记录,以便交流学习。
int checkSum(int* nums, int numsSize, int mid, int left, int right, int* count, int *data)
{
if(left < 0 || right >= numsSize){
return 0;
}
int value = nums[mid] + nums[left] + nums[right];
if(value > 0){
checkSum(nums, numsSize, mid, left-1, right, count, data);
}
if(value < 0){
checkSum(nums, numsSize, mid, left, right+1, count, data);
}
if(value == 0){
//printf("[%d, %d, %d] \n", nums[left], nums[mid], nums[right]);
if(*count < numsSize){
data[ (*count)*3 + 0] = nums[left];
data[ (*count)*3 + 1] = nums[mid];
data[ (*count)*3 + 2] = nums[right];
}
*count = *count + 1;
return 0;
}
return 0;
}
/**
* 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** threeSum(int* nums, int numsSize, int* returnSize, int** returnColumnSizes)
{
/*检验参数*/
if(numsSize < 3 || !returnSize || !returnColumnSizes || !nums){
return NULL;
}
/*特殊参数处理*/
if(numsSize == 3){
if((nums[0] + nums[1] + nums[2]) == 0){
*returnSize = 1;
*returnColumnSizes = malloc(numsSize*sizeof(int));
memcpy(*returnColumnSizes, nums, numsSize*sizeof(int));
return returnColumnSizes;
}else{
return NULL;
}
}
int i = 0, j = 0;
int *sortArray = malloc(numsSize*sizeof(int));
memcpy(sortArray, nums, numsSize*sizeof(int));
/*排序*/
for(i=0; i<numsSize; i++){
for(j=i; j<numsSize; j++){
if(sortArray[i] > sortArray[j]){
int tmp = sortArray[i];
sortArray[i] = sortArray[j];
sortArray[j] = tmp;
}
}
}
int count = 0;
int *data = NULL;
data = (int *)malloc(sizeof(int) * numsSize* 3); //分配维数
for(i=0; i<numsSize/2; i++){
checkSum(sortArray, numsSize, numsSize/2+i, numsSize/2-1+i, numsSize/2+1+i, &count, data);
checkSum(sortArray, numsSize, numsSize/2-i-1, numsSize/2-2-i, numsSize/2-i, &count, data);
}
free(sortArray);
*returnSize = count;
*returnColumnSizes = data;
return data;
}