对于LeectCode里15.三数之和问题的去重解答

题目链接力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台备战技术面试?力扣提供海量技术面试资源,帮助你高效提升编程技能,轻松拿下世界 IT 名企 Dream Offer。icon-default.png?t=N7T8https://leetcode.cn/problems/3sum/

 这里是本题的代码答案:

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;
            if(i>0&&nums[i]==nums[i-1])continue;//i-1<0不符合数组所以i>0

            int left=i+1;
            int right=nums.size()-1;
            while(left<right)
            {
                if(nums[i]+nums[left]+nums[right]>0)right--;
                else if(nums[i]+nums[left]+nums[right]<0)left++;
                else
                {
                    result.push_back(vector<int>{nums[i],nums[left],nums[right]});
                    while(right > left && nums[right]==nums[right-1])right--;
                    while(right > left && nums[left]==nums[left+1])left++;
                    left++;
                    right--;
                }

            }
        }
        return result;
    }
};

在进行大范围遍历之前,把大条件nums[i]一定小于零判断,如果大于零直接return就可以了

然后就是大家比较关注的去重问题,nums【i】==nums【i-1】;这里大家肯定会有点不明白,按照正常逻辑,不应该比较i与i+1吗,为什么是i-1,这里我给大家举个例子就明白了

首先定义一个数组:nums[10]={1,1,-2,1};

然后是去重条件,假如是nums[i]与nums[i+1]比较,那么程序就会i+1==1,接着nums【1】【2】【3】1,-2,1这三个数加起来是零,返回结果,但是大家注意到了没,本题还有一个答案是nums【0】【1】【2】1,1,-2被忽略掉了,而用nums【i】==nums【i-1】作为去重条件则会避免这种情况的发生,当nums【i】==nums【i+1】时,i会直接进入下一个循环加一,导致结果的缺失。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值