15. 三数之和

2019-02-19  本文已影响0人  MarkOut

题目链接:

15. 三数之和

题目描述:

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

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

例如, 给定数组 nums = [-1, 0, 1, 2, -1, -4],
满足要求的三元组集合为:
[
[-1, 0, 1],
[-1, -1, 2]
]

算法:

我们发现这道题目与之前的题目1. 两数之和有异曲同工之妙。本质上是把target换成了-a罢了。因此可以考虑用之前题目的方法去解这道题。

对于方法一:暴力破解法。在这里算法复杂度为O(n^3)。已经超时了。

对于方法二:这里我们先做一遍排序,然后遍历一遍数组,并找到第k个元素后面相加等于-k的元素。总的时间复杂度为O(n^2)

对于方法三:这里显然在用了hash表记录-k之后,还需要两重遍历,时间复杂度为O(n^2),同时,空间复杂度为O(n)

就这道题来说,显然方法二更好。

代码:

class Solution {
public:
    vector<vector<int>> threeSum(vector<int>& nums) {
        vector<vector<int>> result;
        sort(nums.begin(), nums.end());
        for (int i = 0; i < nums.size(); i++) {
            // 去重
            while (i != 0 && i < nums.size() && nums[i - 1] == nums[i])
                i++;
            int j = i + 1, k = nums.size() - 1;
            while (j < k) {
                if (nums[j] + nums[k] + nums[i] < 0) {
                    j++;
                } else if (nums[j] + nums[k] + nums[i] > 0) {
                    k--;
                } else {
                    vector<int> temp;
                    temp.push_back(nums[i]);
                    temp.push_back(nums[j]);
                    temp.push_back(nums[k]);
                    // 去重
                    if (result.empty() || temp != result.back())
                        result.push_back(temp);
                    j++;
                }
            }
        }
        return result;
    }
};

上一篇下一篇

猜你喜欢

热点阅读