15.三数之和(Leetcode)

class Solution {

public:

    vector<vector<int>> threeSum(vector<int>& nums) {

        vector<vector<int>>arr;

                if(nums.size()<3)

                return arr;   //数字不够三个,那么直接返回

                sort(nums.begin(),nums.end()); //进行排序从小到大

                if(nums[0]>0) return arr;    //如果排序好的第一个数字都大于0,那么直接退出就行了,不可能=0的

                for(int i=0;i<nums.size()-2;i++)  //固定一个数,然后用双指针指向其余两个

                {

                    int x = i+1; //首

                    int y = nums.size()-1;  //尾

                    if(i>0 &&nums[i] == nums[i-1]) continue;   //如果说固定的那个数字和前面固定的数字一样,那么跳过,因为这次遍历的结果肯定和上次是一样的

                    while(x<y)     //条件不过界

                    {

                        if(nums[i]+nums[x]+nums[y]<0) x++;  //固定的数,在加他后面的边界如果小于0,说明nums[x]太小,大一点才可能等于0

                        else if(nums[i]+nums[x]+nums[y]>0) y--; // //固定的数,在加他后面的边界如果大于0,说明nums[y]太大,小一点才可能等于0

                        else   //如果相等的情况

                        {

                            vector<int>array;  //存储数据

                            array.push_back(nums[i]);

                            array.push_back(nums[x]);

                            array.push_back(nums[y]);

                            arr.push_back(array);

                            while(x<y && nums[x] == nums[x+1]) x++; //左边界跳过相同的值

                            while(x<y && nums[y] == nums[y-1]) y--;  //右边界跳过相同的值

                            x++;  //左边界到了一个新的值(和下标-1后的值不同的)

                            y--; //左边界到了一个新的值(和下标+1后的值不同的)

                        }

                    }

                }

        return arr;  //返回arr

    }

};

 

 

 

 

慢慢试出来的hhh

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

空寂夜雨时

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值