0
点赞
收藏
分享

微信扫一扫

【C++算法】8.双指针_三数之和

得一道人 2024-10-05 阅读 24

文章目录


题目链接:

15.三数之和


题目描述:

d0406aca4b46568daffef79f8820a511


解法


C++ 算法代码:

class Solution 
{
    public:
    vector<vector<int>> threeSum(vector<int>& nums) 
    {
        vector<vector<int>> ret;//用ret记录结果
        // 1. 排序
        sort(nums.begin(), nums.end());
        // 2. 利用双指针解决问题
        int n = nums.size();
        for(int i = 0; i < n; ) // 固定数 a
        {
            if(nums[i] > 0){
                break; // 小优化
            }
            int left = i + 1, right = n - 1, target = -nums[i];
            while(left < right)
            {
                int sum = nums[left] + nums[right];
                if(sum > target){
                    right--;
                }
                else if(sum < target){
                    left++;
                }
                else{//说明找到最终结果
                    ret.push_back({nums[i], nums[left], nums[right]});//把三个数放到ret里面,{}会形成一个vector int的数组放到ret里面
                    left++, right--;
                    // 去重操作 left 和 right
                    while(left < right && nums[left] == nums[left - 1]){
                        left++;
                    }
                    while(left < right && nums[right] == nums[right + 1]){
                        right--;
                    }
                }
            }
             
            i++;
            // 去重 i
            while(i < n && nums[i] == nums[i - 1]){
                i++;
            }
        }
        return ret;
    }
};

图解

nums=[-4,-4,-1,0,0,0,1,1,4,4,5,6]

34fa0244f07ddec5c539713381884645

  1. n=12,进入for循环,i=0,left=1,right=11,target=4,left < right进入while循环,sum=2<target,left++

2dd3e3a086bdc0457eaf5d700fa423a2

  1. sum=-1+6=5>target,right--

54388bbf03c61d365d837a18085a565b

  1. sum=-1+5=4=targe,把[-4,-1,5]放到ret里面,left++, right--

66036a5d816892562c4e2f3c427bf739

  1. sum=0+4=4=targe,把[-4,0,4]放到ret里面,left++, right--,执行去重操作

a718cff48223687c084491f9cbab2d33

  1. sum=1+1=2<targe,left++,跳出while循环,i++,执行去重,然后开始第二轮双指针算法。

59c352e3a71298c184c55395d2ba535b

  1. 后面的步骤类似,就不多赘述了。
举报

相关推荐

0 条评论