leetcode 15. 三数之和

题目

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

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

示例:

给定数组 nums = [-1, 0, 1, 2, -1, -4],

满足要求的三元组集合为:
[
[-1, 0, 1],
[-1, -1, 2]
]

解法 双指针

首先将数组按照升序排序
这道题设定一个起始指针,限定其余两个元素都位于该指针后面。这道问题就可以转化成二数之和问题。
关键是去重,假设三个指针分别是i,j,k.

  1. nums[i] == num[i - 1] 此时i指针情况可以不讨论。
  2. num[j] + num[k] == sum 此时 于num[j],num[k]相等的元素也可以不考虑。
class Solution {
public:
    vector<vector<int>> threeSum(vector<int>& nums) {
        vector<vector<int>> result;
        if(nums.size() < 3)
            return result;
        int sum = 0,i = 0;
        sort(nums.begin(),nums.end());
        for(; i < nums.size() - 2;i++)
        {
            if(i > 0 &&nums[i] == nums[i - 1] ) //遇到相邻的重复元素,则后者可不用考虑。
                continue;
            int _2_sum = sum - nums[i];
            
            int _2_start  = i + 1;
            int _2_end = nums.size() - 1;
            while( _2_start < _2_end)
            {          
                // 相同的元素和任意两个元素的组合情况都是一样的,考虑一个即可
                if(nums[_2_start] + nums[_2_end] < _2_sum)
                    _2_start++;
                else if(nums[_2_start] + nums[_2_end] > _2_sum)
                    _2_end--;
                else  if(nums[_2_start] + nums[_2_end] == _2_sum && _2_start < _2_end)
                {
                    vector<int> temp {nums[i],nums[_2_start],nums[_2_end]};
                    result.push_back(temp);
                    while(_2_start < _2_end && nums[_2_start] == nums[_2_start+1]) //key:去重不能放在外面,因为在外面去重会漏掉结果
                        _2_start++;
                    while(_2_start< _2_end && nums[_2_end] == nums[_2_end - 1])
                        _2_end--;
                    _2_end--;
                    _2_start++;
                }
                else continue;
            }

        }
        return result;
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值