首页 > 其他 > 详细

leetcode15 三数之和

时间:2019-10-28 23:30:33      阅读:58      评论:0      收藏:0      [点我收藏+]

注意题目没要求数字只能用一次

a + b + c = 0 即为 -b=a+c,同时要求数字不全为正(然后发现a+b+c就行。。。不过多想想没坏处嘛)

先处理特殊情况,然后

排序

 

注意不重复,只需要有一个数不同就行

排序后

对于某组a + b + c = 0 a最小,b,c大于a(都在a的右侧),范围在index【a】-len,这样从两边逼近,时间复杂度最低(可能有多组符合情况)

然后就是遍历,从0-n,得a找bc。因为不重复,nums[I]=NUMS[I-1]就跳过.同时匹配到了b,c后,b++,c--,也要去掉相同的数

然后刚刚想到的同时要求数字不全为正,所以nums[i]>0就没必要继续了

class Solution {
public:
    vector<vector<int>> threeSum(vector<int>& nums) {
        vector<vector<int>>ret;
        if(nums.empty())
            return ret;
        int len=nums.size();
        if(len<3)
            return ret;
        sort(nums.begin(),nums.end());
        for (int i = 0; i < len - 2; i++) {
            if (nums[i] > 0) 
                break;
            if (i > 0 && nums[i] == nums[i - 1]) 
                continue;
            int l = i + 1;
            int r = len - 1;
            while (l < r) { //多组
                int s = nums[i] + nums[l] + nums[r];
                if (s > 0)
                    r--;
                else if (s < 0)
                    l++;
                else {
                    ret.push_back({nums[i], nums[l], nums[r]});
                    while (l < r && nums[l] == nums[++l]);
                    while (l < r && nums[r] == nums[--r]);
                    }
                }
            }
        return ret;
    }
};

 

leetcode15 三数之和

原文:https://www.cnblogs.com/lqerio/p/11755708.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!