LeetCode-15 3Sum

题目链接

题目分析:

找三个数等于0, 三个数从小到大排列,结果集不要有重复。

排序后选取一个数x作为目标,在剩下的中找个两个数的和为-x,从两端向中间逼近。

剩下的问题就是去重

一般来说循环索引按照加加、减减变化,但是为了去重,不断加加或减减,直到跳过重复数字

如,-4, -1, -1, 0, 1, 2

当索引i指向-1后,索引不断加1,直到索引直到0,跳过重复的-1

时间复杂度:O(n*logn)+O(n*n)  注:排序+剩下的

class Solution {
public:
    vector<vector<int>> threeSum(vector<int>& nums) {
        sort(nums.begin(), nums.end());
        vector<vector<int> > res;
        int i = 0;
        while (i < nums.size())
        {
            int goal = -nums[i];
            int j = i + 1;
            int k = nums.size() - 1;
            
            while (j < k)
            {
                if (nums[j] + nums[k] == goal)
                {
                    vector<int> v;
                    v.push_back(nums[i]);
                    v.push_back(nums[j]);
                    v.push_back(nums[k]);
                    res.push_back(v);
                    while (nums[++j] == nums[j - 1]);
                    while (nums[--k] == nums[k + 1]);
                }
                else if (nums[j] + nums[k] < goal)
                {
                    while (nums[++j] == nums[j - 1]);
                }
                else
                {
                    while (nums[--k] == nums[k + 1]);
                }
            }
            while (nums[++i] == nums[i - 1]);
        }
        return res;
    }
};

猜你喜欢

转载自blog.csdn.net/qq_30986521/article/details/80928183
今日推荐