题目描述:
给定一个包含 n 个整数的数组 nums
,判断 nums
中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?找出所有满足条件且不重复的三元组。
注意:答案中不可以包含重复的三元组。
例如, 给定数组 nums = [-1, 0, 1, 2, -1, -4], 满足要求的三元组集合为: [ [-1, 0, 1], [-1, -1, 2] ]
提交代码思路:
1、对数组排序,2、固定一个数字,对后面的数字进行计算两个数字的和是否等于固定数字的相反数,并且判断结束条件,提高执行效率。提交代码如下:
/**
* Return an array of arrays of size *returnSize.
* Note: The returned array must be malloced, assume caller calls free().
*/
#include<stdlib.h>
int comp(const void*a,const void*b)//用来做比较的函数。
{
return *(int*)a-*(int*)b;
}
int** threeSum(int* nums, int numsSize, int* returnSize) {
(*returnSize)=0;
if(nums==NULL || numsSize<3)
{
return NULL;
}
//先对数组nums升序排序
qsort(nums,numsSize,sizeof(int),comp);
//long long resultSize=numsSize*(numsSize-1)*(numsSize-2);
//printf("numsSize=%d,long=%lld\n",numsSize,resultSize);
int resultSize=100*numsSize;
int **result=(int **)malloc(sizeof(int*)*resultSize);
int n=0;
/* for(n=0;n<resultSize;n++)
{
result[n]=(int *)malloc(sizeof(int)*3);
memset(result[n],0,sizeof(int)*3);
}
*/
int i=0,j=1,k=2;
int arrlen=0;
for(i=0;i<numsSize-2;i++)
{
if(nums[i]>0)
{
break;
}
if((i>0) &&(nums[i]==nums[i-1]))
{
continue;
}
int start=i+1,end=numsSize-1;
while(start<end)
{
while((nums[start]+nums[end]<-nums[i])&&(start<end))
{
start++;
}
while((nums[start]+nums[end]>-nums[i])&&(start<end))
{
end--;
}
if((nums[start]+nums[end])==-nums[i]&&(start<end))
{
result[*returnSize]=(int *)malloc(sizeof(int)*3);
memset(result[*returnSize],0,sizeof(int)*3);
result[*returnSize][0]=nums[i];
result[*returnSize][1]=nums[start];
result[*returnSize][2]=nums[end];
while((nums[start]==nums[start+1])&&(start<end) )
{
start++;
}
while((nums[end]==nums[end-1])&&(start<end) )
{
end++;
}
start++;
end--;
(*returnSize)++;
}
}
}
printf("end:*returnSieze=%d,",*returnSize);
return result;
}