C++三数之和等于目标值问题(双指针即可解决)

在这里插入图片描述
首先考虑两数之和==target问题

vector<int> twoSum(vector<int>& nums, int target) {
    // 先对数组排序
    sort(nums.begin(), nums.end());
    // 左右指针
    int lo = 0, hi = nums.size() - 1;
    while (lo < hi) {
        int sum = nums[lo] + nums[hi];
        // 根据 sum 和 target 的比较,移动左右指针
        if (sum < target) {
            lo++;
        } else if (sum > target) {
            hi--;
        } else if (sum == target) {
            return {nums[lo], nums[hi]};
        }
    }
    return {};
}

那么三数之和无非就是先确定第一个数first,再求剩下两数之和等于0-first.注意要求不重复,所以先要排序,排序后只要每次确定的first值以及left值不能跟之前取的重复即可,为什么只用保证这两个不重复?因为三数确定两个不重复,第三个必然不重复,(在排过序的情况下)

class Solution {
public:
    vector<vector<int>> threeSum(vector<int>& nums) {
        if(nums.size()<3) return {};
     vector<vector<int>> res;
     sort(nums.begin(),nums.end());
     for(int i=0;i<nums.size()-2;i++){
           if (i > 0 && nums[i] == nums[i - 1]) {
                continue;
            }//i为第一个数,后续第一个数不能跟上一个取的一致,因为是排过序的数,所以必然会导致重复
         int left=i+1,right=nums.size()-1;
         int twosum=-nums[i];
         while(left<right){//left为第二个数,right为第三个数
             if (left >i + 1 && nums[left] == nums[left - 1]) {//第二个数取的不能跟上次取的一致,因为是排过序的数,所以第三个数必然会导致重复
                    left++;
                    continue;
                }
            if(nums[left]+nums[right]<twosum) left++;
            else if(nums[left]+nums[right]>twosum)right--;
            else  {
            res.push_back({nums[i],nums[left],nums[right]});
             left++;
             right--;
            }
         } 
     }
     return res;
    }
};

版权声明:本文为qq_41884662原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。