LeetCode 第 15 号问题:三数之和

本文首发于公众号「五分钟学算法」,是图解 LeetCode 系列文章之一。c++

我的网站:www.cxyxiaowu.comgit

题目来源于 LeetCode 上第 15 号问题:三数之和。github

题目描述

给定一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 *a,b,c ,*使得 a + b + c = 0 ?找出全部知足条件且不重复的三元组。算法

题目解析

题目须要咱们找出三个数且和为 0 ,那么除了三个数全是 0 的状况以外,确定会有负数和正数,因此一开始能够先选择一个数,而后再去找另外两个数,这样只要找到两个数且和为第一个选择的数的相反数就好了。也就是说须要枚举 a 和 b ,将 c 的存入 map 便可。数组

须要注意的是返回的结果中,不能有有重复的结果。这样的代码时间复杂度是 O(n^2)。在这里能够先将原数组进行排序,而后再遍历排序后的数组,这样就能够使用双指针以线性时间复杂度来遍历全部知足题意的两个数组合。动画

动画描述

待补充网站

代码实现

class Solution {
public:
    vector<vector<int>> threeSum(vector<int>& nums) {
        vector<vector<int>> res;
        sort(nums.begin(), nums.end());
        if (nums.empty() || nums.back() < 0 || nums.front() > 0) return {};
        for (int k = 0; k < nums.size(); ++k) {
            if (nums[k] > 0) break;
            if (k > 0 && nums[k] == nums[k - 1]) continue;
            int target = 0 - nums[k];
            int i = k + 1, j = nums.size() - 1;
            while (i < j) {
                if (nums[i] + nums[j] == target) {
                    res.push_back({nums[k], nums[i], nums[j]});
                    while (i < j && nums[i] == nums[i + 1]) ++i;
                    while (i < j && nums[j] == nums[j - 1]) --j;
                    ++i; --j;
                } else if (nums[i] + nums[j] < target) ++i;
                else --j;
            }
        }
        return res;
    }
};
复制代码

相关文章
相关标签/搜索