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> threeSum(vector& nums) {
        int n = nums.size();
        sort(nums.begin(),nums.end());
        vector> 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 tmp;
                    tmp.push_back(nums[i]);
                    tmp.push_back(nums[j]);
                    tmp.push_back(-x);
                    ans.push_back(tmp);
                } 
            }
        }
        return ans;
    }
};

你可能感兴趣的:(Leetcode15 三数之和)