三数之和~

三数之和本题题意可以看作i<j<k所以遍历数组时候选中一个数,另外两个数用双指针算法进行求解

class Solution {
public:
    vector<vector<int>> threeSum(vector<int>& nums) {
        sort(nums.begin(),nums.end());
        vector<vector<int>>ans;
        
        for(int i=0;i<nums.size()-2;i++)//遍历i,本题i<j<k,所以仅需遍历到num.size()-2
        {
            int x=nums[i];
            if(i&&x==nums[i-1])continue;//防止找到重复的组合,因为前一个i已经找到了但是后一个相同就重复了
            if(x+nums[i+1]+nums[i+2]>0)break;//因为排序过了如果x+最小的两个都比0大那么后面就不可能有=0的了
            if(x+nums[nums.size()-1]+nums[nums.size()-2]<0)continue;//这个和break有区别,但是本意和上面的差不多
            int j=i+1,k=nums.size()-1;//双指针
            while(j<k)
            {
                int s=x+nums[j]+nums[k];
                if(s>0)k--;
                else if(s<0)j++;
                else//这个else就是三数之和为0
                {
                    ans.push_back({x,nums[j],nums[k]});//加入ans
                    for (j++; j < k && nums[j] == nums[j - 1]; j++); // 和第一个if同样的意思
                    for (k--; k > j && nums[k] == nums[k + 1]; k--); // 和第一个if同样的意思


                }
            }
        }
        return ans;
    }
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值