Given an array S of n integers, are there elements a, b, c in S such that a + b + c = 0? Find all unique triplets in the array which gives the sum of zero.
Note: The solution set must not contain duplicate triplets.
For example, given array S = [-1, 0, 1, 2, -1, -4], A solution set is: [ [-1, 0, 1], [-1, -1, 2] ]解法:
/******************************************
*@time 2016/09/07 22:18
*@place dhu.13#.5005
***********************************************/
#include<cstdio>
#include<cstdlib>
void quick_sort(int *ori_Nums,int begin_Index,int end_Index)
{
if(end_Index-begin_Index<=0) return;
int lit=begin_Index;
int rit=end_Index;
int flag=ori_Nums[begin_Index];
while(lit<rit)
{
while(ori_Nums[rit]>=flag&&lit<rit) rit--;//从后往前找比flag小的数字
while(ori_Nums[lit]<=flag&&lit<rit) lit++;//从前往后找比flag大的数
if(lit<rit)//比flag大的数和小的数都找到了,则交换
{
int tmp=ori_Nums[rit];
ori_Nums[rit]=ori_Nums[lit];
ori_Nums[lit]=tmp;
}
//处理结束时必定为以下两个情景之一
else if(rit!=begin_Index)//只找到了比flag小的数,则交换flag与小的数
{
ori_Nums[begin_Index]=ori_Nums[rit];
ori_Nums[rit]=flag;
}
//都没有找到,则证明已排好,不处理
}
quick_sort(ori_Nums,begin_Index,rit);//将flag左侧分治排序(包括flag)
quick_sort(ori_Nums,rit+1,end_Index);//将flag右侧分治排序
}
int** threeSum(int* nums, int numsSize, int* returnSize)
{
quick_sort(nums,0,numsSize-1);//排序
int **results=(int**)malloc(sizeof(int*)*numsSize*3);
int _count=0;
for(int i=0;i<numsSize-2;i++)
{
if(nums[i]>0) break;//第一个数大于0则和不可能为0,退出
if(i>0&&nums[i]==nums[i-1]) continue;//过滤掉相同的情况
int sum=nums[i];
for(int j=i+1;j<numsSize-1;j++)
{
if(j>i+1&&nums[j]==nums[j-1]) continue;//过滤掉相同的情况
if(sum+nums[j]>0) break;//sum此时大于0则没有等于0的机会了
sum+=nums[j];
for(int k=numsSize-1;k>=j+1;k--)//倒序,匹配到的几率更大
{
if(k<numsSize-1&&nums[k]==nums[k+1]) continue;//过滤掉相同的情况
if(sum+nums[k]<0)break;//sum此时小于0则没有等于0的机会了
if(sum+nums[k]==0)
{
int* tmp=(int*)malloc(sizeof(int)*3);//动态分配,不能用int[]
tmp[0]=nums[i];
tmp[1]=nums[j];
tmp[2]=nums[k];
results[_count]=tmp;
_count++;
}
}
sum-=nums[j];
}
}
*returnSize=_count;
return results;
}
int main()
{
int tmp[6]={-1,0,1,2,-1,-4};
int _count=0;
int** results=threeSum(tmp,6,&_count);
for(int i=0;i<_count;i++)
{
printf("%d %d %d\n",results[i][0],results[i][1],results[i][2]);
}
return 0;
}