思路详解:
1.将数组从小到大排序
2.首先固定左边第i个数字,转换为两数求和问题
3.用双指针使得left=i+1,right=numSize-1;
4.移动左右指针,满足条件则保存起来,当left==right时,i++并执行第2步骤
难点:去除重复的三元组
1.如果固定的数字判断过后,相同,则跳过。
if(i>0&&nums[i]==nums[i-1]){
continue;
}
2.同样,双指针指定的数字已经保存后相同,也跳过。
left++;
while(left<right&&nums[left]==nums[left-1]){
left++;
}
right--;
while(left<right&&nums[right]==nums[right+1]){
right--;
}
代码及解析如下:
int * * threeSum ( int * nums, int numsSize, int * returnSize, int * * returnColumnSizes) {
* returnSize= 0 ;
if ( numsSize< 3 ) {
return NULL ;
}
int flag= 1 , temp;
while ( flag) {
flag= 0 ;
for ( int i= 0 ; i< numsSize- 1 ; i++ ) {
if ( nums[ i] > nums[ i+ 1 ] ) {
temp= nums[ i] ;
nums[ i] = nums[ i+ 1 ] ;
nums[ i+ 1 ] = temp;
flag= 1 ;
}
}
}
int * * res= ( int * * ) malloc ( sizeof ( int * ) * 30010 ) ;
* returnColumnSizes= ( int * ) malloc ( sizeof ( int ) * 30010 ) ;
for ( int i= 0 ; i< numsSize- 1 ; i++ ) {
int left= i+ 1 , right= numsSize- 1 ;
if ( i> 0 && nums[ i] == nums[ i- 1 ] ) {
continue ;
}
while ( left< right) {
int sum= nums[ i] + nums[ left] + nums[ right] ;
if ( sum== 0 ) {
res[ * returnSize] = ( int * ) malloc ( sizeof ( int ) * 3 ) ;
res[ * returnSize] [ 0 ] = nums[ i] ;
res[ * returnSize] [ 1 ] = nums[ left] ;
res[ * returnSize] [ 2 ] = nums[ right] ;
( * returnColumnSizes) [ * returnSize] = 3 ;
( * returnSize) ++ ;
left++ ;
while ( left< right&& nums[ left] == nums[ left- 1 ] ) {
left++ ;
}
right-- ;
while ( left< right&& nums[ right] == nums[ right+ 1 ] ) {
right-- ;
}
} else if ( sum> 0 ) {
right-- ;
} else if ( sum< 0 ) {
left++ ;
}
}
}
return res;
}