Leecode 15三数之和

Leecode 15 .三数之和

先对数组做排序

用双指针法,for循环中 , left = i+1,right = nums.size() -1;

for循环中,首先对i进行去重,因为需要返回不重复的三元组,

内层的while循环中,循环条件为 left < right,同样的,我们也需要对left 和 right 进行去重,那么如何去重呢,是进入循环时直接去重,还是找到一个三元组以后再去重呢?

考虑一个刚开始便是[0,0,0]的三元组,若是再while循环刚开始对它进行去重的话,会导致left >= right ,从而漏过了这种情况,所以我们需要在找到一个三元组后,再进行去重。
在这里插入图片描述

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++) // 三元组, 至少三个数字
        {   
            if(nums[i] > 0) return result; // 第一个数字大于0,则不可能存在这样的三元组
            //对 i 去重
            if(i > 0 && nums[i] == nums[i-1]) continue; // 下标为0时还是正常进入的,从1开始判断去重逻辑
            int left = i + 1;
            int right = nums.size() -1;
            while( left < right)
            {   int sum = nums[i] + nums[left] + nums[right];
                if(sum>0){
                right --;
                } 
                else if(sum < 0)
                {
                left ++;
                }
                else
                {
                    result.push_back(vector<int>{nums[i],nums[left],nums[right]});
                    // 在这里对left 和 right 进行去重
                    while(left < right && nums[left] ==nums[left+1])//移动到left的下个元素与当前left不同 
                    {left++;}
                    while(right > left && nums[right -1] == nums[right])
                    {right--;}
                    // 同时收缩,因为前面的去重已经保证left++ 和left不同, right-- 和right不同了
                left ++;
                right --;
                }
            }
        }
        return result;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值