【LeetCode-15】三数之和

问题

给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有和为 0 且不重复的三元组。

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

示例

输入: nums = [-1,0,1,2,-1,-4]
输出: [[-1,-1,2],[-1,0,1]]

解答

class Solution {
public:
    vector<vector<int>> threeSum(vector<int>& nums) {
        vector<vector<int>> res;
        int n = nums.size();
        sort(nums.begin(), nums.end());
        for (int i = 0; i < n; i++) { // 遍历nums得到第一个候选数
            vector<vector<int>> ans;
            int lo = i + 1, hi = n - 1;
            while (lo < hi) {
                int left = nums[lo], right = nums[hi];
                int sum = left + right + nums[i];
                if (sum > 0)
                    while (lo < hi && nums[hi] == right) hi--;
                else if (sum < 0)
                    while (lo < hi && nums[lo] == left) lo++;
                else {
                    ans.push_back({nums[lo], nums[hi]});
                    while (lo < hi && nums[hi] == right) hi--;
                    while (lo < hi && nums[lo] == left) lo++;
                }
            }
            for (auto& v : ans) {
                v.push_back(nums[i]);
                res.push_back(v);
            }
            while (i < n - 1 && nums[i] == nums[i + 1]) i++;
        }
        return res;
    }
};

重点思路

要解决三数之和,我们可以先确定一个数后,再对剩下两个数做二数之和,具体实现就是排序后,遍历数组取得第一个候选值,剩下两个在该值的右边使用双指针查找。注意本题的去重操作。

posted @ 2021-04-02 09:51  tmpUser  阅读(40)  评论(0编辑  收藏  举报