C实现 LeetCode->3Sum

来源:互联网 发布:知其所以然的意思 编辑:程序博客网 时间:2024/04/30 01:12

Given an array S of n integers, are there elements abc in S such that a + b + c = 0? Find all unique triplets in the array which gives the sum of zero.

1:给定一个 整形数组S 里面的元素 满足 a+b+C =0 ;

2:满足a<= b <= c 排序






////  3Sum.c//  Algorithms////  Created by TTc on 15/6/12.//  Copyright (c) 2015年 TTc. All rights reserved.//#include "3Sum.h"#include <stdlib.h>#include <string.h>/** *   三元素(a,b,c)必须排序。(a≤b≤c)   解集必须不包含重复的三元素。 */static intcmp(const int*a,const int *b){    return *a - *b;}/** * Return an array of arrays of size *returnSize. * Note: The returned array must be malloced, assume caller calls free(). */int**threeSum(int* nums, int numsSize, int* returnSize){    if (numsSize <= 0) return NULL;    int total = 64;    int size = 0;    int i,start,end,sum;    int ** result = (int **)malloc(sizeof(int *) * total);    for(i = 0 ;i< total; i++){        result[i] = (int *)malloc(sizeof(int)* 3);    }    qsort(nums, numsSize, sizeof(int), (int(*)(const void *,const void *))cmp);        for(i = 0; i < numsSize-2; ++i){        if(i > 0 && nums[i] == nums[i-1]){            continue;        }        start = i + 1;        end = numsSize - 1;        while(start < end){            sum = nums[i] + nums[start] + nums[end];            if(sum == 0){                if(size > 0 && result[size-1][0] == nums[i] &&                   result[size-1][1] == nums[start] && result[size-1][2] == nums[end]){                    ++start;                    --end;                    continue;                }                result[size][0] = nums[i];                result[size][1] = nums[start];                result[size][2] = nums[end];                size++;                                if(size == total){                    total <<= 1;                    int t;                    result = (int **)realloc(result,sizeof(int *) * total);                    for(t = size; t < total; ++t)                        result[t] = (int *)malloc(sizeof(int) * 3);                }                ++start;                --end;            } else if(sum > 0){                --end;            }else{                ++start;            }        }    }        *returnSize = size;    return result;}voidtest_3Sum(){    int nums[10] = {-1, 0 ,1 ,2 ,-1, -4};    int * returnSize = NULL;    returnSize = malloc(sizeof(int));    int ** result = threeSum(nums, 6, returnSize);    printf("returnSize===%d \n",*returnSize);        for (int j = 0; j < *returnSize; j++) {        for (int i = 0 ; i < 3; i++) {            printf("result[%d][%d]===%d \n",j,i,result[0][i]);        }    }}



0 0