美文网首页
15. 三数之和

15. 三数之和

作者: MarkOut | 来源:发表于2019-02-19 22:25 被阅读0次

    题目链接:

    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;
        }
    };
    
    

    相关文章

      网友评论

          本文标题:15. 三数之和

          本文链接:https://www.haomeiwen.com/subject/unkqyqtx.html