美文网首页leetcode
15. 三数之和

15. 三数之和

作者: geaus | 来源:发表于2020-06-13 20:47 被阅读0次

    题目描述

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

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

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

    解题思路

    排序+双指针。
    first元素从下标0开始遍历,second、third元素则分别从first+1和n-1往中间靠拢。需要注意,由于不能有重复的三元组,所以first>0时,需要检查first和first-1的值是否相等,若相等则first++,同理second和third也是。

        vector<vector<int>> threeSum(vector<int>& nums) {
            sort(nums.begin(), nums.end());
            vector<vector<int>> ret;
            if(nums.size()<3)
                return ret;
            // [-2,-1,0,1,2,3] 
            for(int first=0; first<nums.size()-2; first++){
                if(first>0 && nums[first]==nums[first-1])
                    continue;
                int second = first+1;
                int third = nums.size()-1;
                int target = -nums[first];
                while(second<third){
                    if(nums[second]+nums[third]==target){
                        ret.push_back(vector<int>{nums[first], nums[second], nums[third]});
                        second++;
                        third--;
                        while(second<third && nums[second]==nums[second-1])
                            second++;
                        while(second<third && nums[third]==nums[third+1])
                            third--;
                    }else if(nums[second]+nums[third]>target){
                        third--;
                    }else{
                        second++;
                    }
                }
            }
    
            return ret;
        }
    

    相关文章

      网友评论

        本文标题:15. 三数之和

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