/* 给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素a,b,c,使得 a + b + c = 0 ? 请你找出所有满足条件且不重复的三元组。 注意:答案中不可以包含重复的三元组。 [ [-1, 0, 1], [-1, -1, 2] ] */ #include<stdio.h> #include<malloc.h> #include<string.h> #include<stdlib.h> #include<math.h> #include<string.h> #include <iostream> int getMax(int a,int b){ if(a>b) return a; return b; } int getMin(int a,int b){ if(a<b) return a; return b; } void print(int nums[],int n){ int i; for(i=0;i<n;i++){ printf("%d ",nums[i]); } printf(" "); } void printD(int a[][3],int col,int row){ int i,j; for(i=0;i<col;i++){ for(j=0;j<row;j++){ printf("%d ",a[i][j]); } printf(" "); } } void sortNums(int nums[],int n){ int i,j,temp; for(i=0;i<n;i++){ for(j=0;j<n-i-1;j++){ if(nums[j]>nums[j+1]){ temp=nums[j]; nums[j]=nums[j+1]; nums[j+1]=temp; } } } } int CompareByIncrease(const void* a,const void *b){ return *(int *)a-*(int*)b; } int** threeSum(int* nums, int numsSize, int* returnSize, int** returnColumnSizes){ qsort(nums,numsSize,sizeof(int),CompareByIncrease); int k,i,j,temp,target; int **returnArray = (int**)malloc(sizeof(int*)*(numsSize)*(numsSize)); for(k=0;k<numsSize-2;k++){ if(k>0&&k+2<numsSize&&nums[k]==nums[k-1]) continue; i=k+1; j=numsSize-1; target=-nums[k]; while(i<j){ if(nums[i]+nums[j]==target){ returnArray[*returnSize] = (int*)malloc(sizeof(int)*3); returnArray[*returnSize][0]=nums[k]; returnArray[*returnSize][1]=nums[i]; returnArray[*returnSize][2]=nums[j]; (*returnSize)++; i++; j--; while(i<j&&nums[i]==nums[i+1]) i++; while(i<j&&nums[j]==nums[j-1]) j--; }else if(nums[i]+nums[j]>target){ j--; }else{ i++; } } } return returnArray; } int main() { int **rs,nums[] = {-1, 0, 1, 2, -1, -4},numsSize=6,* returnSize,** returnColumnSizes,(*p)[3],i,j; rs = threeSum(nums,numsSize,returnSize,returnColumnSizes); for(i=0;i<2;i++){ for(j=0;j<3;j++){ printf("%d ",*(*(p+i)+j)); } printf(" "); } return 0; }