Leetcode15 三数之和

Posted niyada

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Leetcode15 三数之和相关的知识,希望对你有一定的参考价值。

题目链接


题意:给你一个包含 (n) 个整数的数组?(nums),判断?(nums)?中是否存在三个元素 (a,b,c) ,使得?(a + b + c = 0),请你找出所有满足条件且不重复的三元组。

注意:答案中不可以包含重复的三元组。

思路:

题目等价于求 (a + b = -c), 将数组从小到大排序,然后枚举 (c) 的值, 最后利用 双指针 算法 (O(n)) 求出满足等式的元组。总时间复杂度 (O(n^2)).

需要注意的是,题目要求 元组不能重复, 这是本道题目最关键的点。为了解决这个问题,我们可以:

  • 不重复地枚举 (c) 的值;
  • 其次不重复地枚举 (a) 的值;
  • 最后在 (a) 之后的区间寻找 (b) 的值;

对于这些限制条件,很容易在双指针算法上实现,具体看代码吧。

class Solution {
public:
    vector<vector<int>> threeSum(vector<int>& nums) {
        int n = nums.size();
        sort(nums.begin(),nums.end());
        vector<vector<int>> ans;
        int cnt = 0;
        for (int k = 0; k < n; ++ k)
        {
            if (k > 0 && nums[k] == nums[k - 1]) continue;
            int x = -nums[k];
            for (int i = k + 1, j = n - 1; i < n; ++ i)
            {
                if (i > k + 1 && nums[i] == nums[i - 1]) continue;
                while (j > i && nums[i] + nums[j] > x) j --;
                if (j <= i) break;
                if (nums[i] + nums[j] == x)
                {
                    vector<int> tmp;
                    tmp.push_back(nums[i]);
                    tmp.push_back(nums[j]);
                    tmp.push_back(-x);
                    ans.push_back(tmp);
                } 
            }
        }
        return ans;
    }
};

以上是关于Leetcode15 三数之和的主要内容,如果未能解决你的问题,请参考以下文章

LeetCode15.三数之和(C++,Python)

LeetCode15.三数之和(C++,Python)

leetcode(15)三数之和+去重

LeetCode1两数之和15三数之和

LeetCode1两数之和15三数之和

LeetCode刷题15-简单-三数之和