题目
给你一个整数数组 nums ,判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i != j、i != k 且 j != k ,同时还满足 nums[i] + nums[j] + nums[k] == 0 。请
你返回所有和为 0 且不重复的三元组。
题解
解题思路
1.利用快排,将数组元素从小到大排序
2.遍历排序后的数组,对于每一个元素nums[i],在nums中寻找和等于-nums[i]的两个元素。
3.步骤2可以归结为寻找两数之和。设置双指针low和high。如果nums[low]+nums[high]>-nums[i],就high–。如果nums[low]+nums[high]<-nums[i],就low++。
解题难点
解题的难点是去重。
1.判断nums[i],是否等于nums[i-1],若等于则遍历下一个元素。
2.判断nums[i]是否大于0,若nums[i]>0,则结束遍历。
代码
int** threeSum(int* nums, int numsSize, int* returnSize, int** returnColumnSizes){
qsort(nums,numsSize,sizeof(int),cmp);
int low,high=numsSize,count=0,flag=0;
//数组要开到足够大,不然会报错
int **final=(int **)malloc(sizeof(int *)*30000);
*returnColumnSizes=(int *)malloc(sizeof(int *)*30000);
for(int i=0;i<numsSize;i++){
if(nums[i]>0)
break;
if(i>0&&nums[i]==nums[i-1])
continue;
//low从i+1开始是为了去重
low=i+1;
high=numsSize-1;
while(low<high){
if(low==i)
low++;
if(high==i)
high--;
if(-nums[i]==nums[low]+nums[high]){
final[count]=(int *)malloc(sizeof(int)*3);
final[count][0]=nums[i];
final[count][1]=nums[low];
final[count][2]=nums[high];
(*returnColumnSizes)[count]=3;
count++;
//找到所有等-nums[i]的和
while(low<high&&nums[low+1]==nums[low]){
low++;
}
low++;
while(low<high&&nums[high-1]==nums[high]){
high--;
}
high--;
}else if(-nums[i]>nums[low]+nums[high]){
//high--;
low++;
}else{
high--;
}
}
}
*returnSize=count;
return final;
}