leetcode——第15题——三数之和/双指针

题目:
给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有和为 0 且不重复的三元组。

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

class Solution {
public:
    // 自己再来一遍,三数之和,本题采用的是双指针法,这一次自己尝试写一遍
    // 1、快慢指针在哪里定义初始化?
     vector<vector<int>> threeSum(vector<int>& nums) 
     {
         // 1、先排序
        vector<vector<int>> result;
        sort(nums.begin(),nums.end());
        // 每一组的第一个元素都不可能大于0,所以要放在循环里
        // if(nums[0]>0||nums.size()<3)
        // {
        //     return{};
        // }
        if(nums.size()<3)
        {
            return result;
        }

        for(int i=0;i<nums.size()-2;i++)
        {
            if(nums[i]>0)
            {
                return result;
            }
            // 2、第一个字符去重
            if(i > 0 && nums[i]==nums[i-1])
            {
                continue;
            }

            int left=i+1;
            int right=nums.size()-1;
            while(left<right)
            {
                if(nums[i]+nums[right]+nums[left]<0)
                {
                    left++;
                }
                else if(nums[i]+nums[right]+nums[left]>0)
                {
                    right--;
                }
                else
                {
        // 这里的插入也不会写哦***********************************
        // s.push_back(vector<int>{a,b,c}) 容器嵌套容器的写法
        result.push_back(vector<int>{nums[i],nums[left],nums[right]});

                    // 去重
                    while(left<right && nums[right]==nums[right-1])
                    {
                        right--;
                    }
                    while(left<right &&nums[left]==nums[left+1])
                    {
                        left++;
                    }

                    // 找到一组,快慢指针需要同时往中间收缩
                    right--;
                    left++;
                }
            }
        }
        return result;

     }


    // 第一遍,算是cpoy
    // vector<vector<int>> threeSum(vector<int>& nums) {
    //     vector<vector<int>> result;
    //     sort(nums.begin(),nums.end());

    //     for(int i=0;i<nums.size();i++)
    //     {
    //         // 排序之后如果第一个元素大于0,那肯定false
    //         if(nums[i]>0)
    //         {
    //             return result;
    //         }
    //         // 第一个元素去重:(有点蒙)
    //         if(i>0 && nums[i]==nums[i-1])
    //         {
    //             continue;
    //         }
    //         int left=i+1;
    //         int right=nums.size()-1;
    //         while(right>left)
    //         {
    //             // 在while循环中先找到三元组
    //             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++;
    //                 }

    //                 // 找到答案时,双指针同时收缩
    //                 right--;
    //                 left++;
    //             }
    //         }

    //     }
    //     return result;
    // }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值