码迷,mamicode.com
首页 > 其他好文 > 详细

LeetCode 15. 三数之和

时间:2020-02-19 12:59:07      阅读:54      评论:0      收藏:0      [点我收藏+]

标签:cto   不可   sort   遍历   vector   leetcode   总结   执行   int   

题意

定义一个三元组为\(a+b+c = 0\),从包含\(n\)个整数的数组中,找出所有满足条件的不重复三元组。

思路

  • 想法1:暴力,\(O(n^3)\)

  • 想法2:用“桶”记录下每个数值出现的次数,遍历前两个数,判断第三个数是否存在。时间复杂度:\(O(n^2)\),空间复杂度:\(O(n)\)

  • 想法3:排序 + 双指针。排序后从小到大遍历数组,具体判断情况如下:

    1. nums[i] > 0,后面不可能有三个数之和为0,结束循环。
    2. 重复元素跳过,避免重复解。
    3. 令左指针L = i + 1,右指针R = n - 1,当\(L \lt R\)时,执行如下循环:
      • nums[i] + nums[L] + nums[R] ==0,判断边界位置是否和下一位置重复,若重复则去重。记录答案,将\(L、R\)移到下一位置。
      • 三数之和大于0,R左移。
      • 三数之和小于0,L右移。

    时间复杂度:\(O(n^2)\),空间复杂度:\(O(n)\)

代码

class Solution {
public:
    vector<vector<int>> threeSum(vector<int>& nums) {

        int len = nums.size();
        if(len < 3) return {};

        sort(nums.begin(), nums.end());
        vector<vector<int>> res;
        int L, R;
        for(int i = 0; i < len; ++i)
        {
            if(nums[i] > 0) break;
            if(i && nums[i] == nums[i - 1]) continue;
            L = i + 1;
            R = len - 1;
            while(L < R)
            {
                if(nums[i] + nums[L] + nums[R] == 0)
                {
                    res.push_back({nums[i], nums[L],nums[R]});
                    while(L + 1 < len && nums[L + 1] == nums[L])   ++L;
                    while(R - 1 > 0 && nums[R - 1] == nums[R])   --R;
                    ++L; --R;
                }
                else if(nums[i] + nums[L] + nums[R] > 0)
                    --R;
                else
                    ++L;
//                cout << L << ' ' << R << endl;
            }
        }
        return res;
    }
};

总结

这种找数字的很多都涉及到了排序,利用有序可以加快查找速度。

LeetCode 15. 三数之和

标签:cto   不可   sort   遍历   vector   leetcode   总结   执行   int   

原文地址:https://www.cnblogs.com/songjy11611/p/12330705.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!