• leetcode15 三数之和 双指针


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

    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;
        }
    };
  • 相关阅读:
    函数
    字符串格式化
    集合
    习题02
    int/str/list/tuple/dict必会
    元组/字典
    列表方法
    练习题(format、expandtabs、片层)
    字符串方法
    JMM
  • 原文地址:https://www.cnblogs.com/lqerio/p/11755708.html
Copyright © 2020-2023  润新知