三数之和

/*
给你一个包含 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;
}
原文地址:https://www.cnblogs.com/zhaohuan1996/p/12606281.html