/*
给你一个包含 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("\n");
}
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("\n");
}
}
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("\n");
}
return 0;
}