leetcode刷题——三数之和

题目

给你一个整数数组 nums ,判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i != j、i != k 且 j != k ,同时还满足 nums[i] + nums[j] + nums[k] == 0 。请

你返回所有和为 0 且不重复的三元组。

题解

解题思路

1.利用快排,将数组元素从小到大排序
2.遍历排序后的数组,对于每一个元素nums[i],在nums中寻找和等于-nums[i]的两个元素。
3.步骤2可以归结为寻找两数之和。设置双指针low和high。如果nums[low]+nums[high]>-nums[i],就high–。如果nums[low]+nums[high]<-nums[i],就low++。

解题难点

解题的难点是去重。
1.判断nums[i],是否等于nums[i-1],若等于则遍历下一个元素。
2.判断nums[i]是否大于0,若nums[i]>0,则结束遍历。

代码

int** threeSum(int* nums, int numsSize, int* returnSize, int** returnColumnSizes){
    qsort(nums,numsSize,sizeof(int),cmp);
    int low,high=numsSize,count=0,flag=0;
    //数组要开到足够大,不然会报错
    int **final=(int **)malloc(sizeof(int *)*30000);
    *returnColumnSizes=(int *)malloc(sizeof(int *)*30000);
    for(int i=0;i<numsSize;i++){
       if(nums[i]>0)
           break;
       if(i>0&&nums[i]==nums[i-1])
           continue; 
        //low从i+1开始是为了去重
        low=i+1;
       high=numsSize-1;
       while(low<high){
           if(low==i)
              low++;
            if(high==i)
              high--;
           if(-nums[i]==nums[low]+nums[high]){
               final[count]=(int *)malloc(sizeof(int)*3);
               final[count][0]=nums[i];
               final[count][1]=nums[low];
               final[count][2]=nums[high];
               (*returnColumnSizes)[count]=3;
               count++;
               //找到所有等-nums[i]的和
               while(low<high&&nums[low+1]==nums[low]){
                    low++;
               }
               low++;
                while(low<high&&nums[high-1]==nums[high]){
                    high--;
               }
               high--;
              
           }else if(-nums[i]>nums[low]+nums[high]){
               //high--;
               low++;
           }else{
               high--;
           }
       }
    }
    *returnSize=count;
    return final;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值