【leetcode】三数之和

题目描述:

给定一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?找出所有满足条件且不重复的三元组。

注意:答案中不可以包含重复的三元组。

例如, 给定数组 nums = [-1, 0, 1, 2, -1, -4],

满足要求的三元组集合为:
[
  [-1, 0, 1],
  [-1, -1, 2]
]

提交代码思路:

1、对数组排序,2、固定一个数字,对后面的数字进行计算两个数字的和是否等于固定数字的相反数,并且判断结束条件,提高执行效率。提交代码如下:

/**
 * Return an array of arrays of size *returnSize.
 * Note: The returned array must be malloced, assume caller calls free().
 */
#include<stdlib.h>

int comp(const void*a,const void*b)//用来做比较的函数。
{
    return *(int*)a-*(int*)b;
}

int** threeSum(int* nums, int numsSize, int* returnSize) {
    (*returnSize)=0;
    if(nums==NULL || numsSize<3)
    {
        return NULL;
    }
    //先对数组nums升序排序
    qsort(nums,numsSize,sizeof(int),comp);
    //long long resultSize=numsSize*(numsSize-1)*(numsSize-2);
    //printf("numsSize=%d,long=%lld\n",numsSize,resultSize);
    int resultSize=100*numsSize;

    int **result=(int **)malloc(sizeof(int*)*resultSize);
    
    int n=0;
/*    for(n=0;n<resultSize;n++)
    {
        result[n]=(int *)malloc(sizeof(int)*3);
        memset(result[n],0,sizeof(int)*3);
    }
*/    
    int i=0,j=1,k=2;
    int arrlen=0;
    for(i=0;i<numsSize-2;i++)
    {
        if(nums[i]>0)
        {
            break;
        }
        if((i>0) &&(nums[i]==nums[i-1]))
        {
            continue;
        }
        int start=i+1,end=numsSize-1;
        while(start<end)
        {
            while((nums[start]+nums[end]<-nums[i])&&(start<end))
            {
                start++;
            }
            while((nums[start]+nums[end]>-nums[i])&&(start<end))
            {
                end--;
            }
            if((nums[start]+nums[end])==-nums[i]&&(start<end))
            {
                result[*returnSize]=(int *)malloc(sizeof(int)*3);
                memset(result[*returnSize],0,sizeof(int)*3);

                result[*returnSize][0]=nums[i];
                result[*returnSize][1]=nums[start];
                result[*returnSize][2]=nums[end];
                while((nums[start]==nums[start+1])&&(start<end) )
                {
                    start++;
                }
                while((nums[end]==nums[end-1])&&(start<end) )
                {
                    end++;
                }
                start++;
                end--;
                (*returnSize)++;
            }
        }
    }
    printf("end:*returnSieze=%d,",*returnSize);
    return result;
}

猜你喜欢

转载自blog.csdn.net/y___y___/article/details/81271632