【LeetCode】15. 三数之和

解题思路

参考自画解算法:15. 三数之和
【LeetCode】15. 三数之和_第1张图片

代码

#include
#include
#include
using namespace std;
class Solution {
     
public:
    vector<vector<int>> threeSum(vector<int>& nums) {
     
        vector<vector<int>> ans;
        int len = nums.size();
        if (len < 3) return ans;
        sort(nums.begin(), nums.end());//排序
        for (int i = 0; i < len; i++) {
     
            if (nums[i] > 0) break;//当前数字大于0,说明三数之和一定大于0
            if (i > 0 && nums[i] == nums[i - 1]) continue;//数字重复,应该跳过
            int pLeft = i+1, pRight = len - 1;//双指针
            while (pLeft < pRight) {
     
                int sum = nums[i] + nums[pLeft] + nums[pRight];
                if (sum == 0) {
     
                    ans.push_back({
      nums[i],nums[pLeft],nums[pRight]});
                    while (pLeft < pRight&&nums[pLeft] == nums[pLeft + 1]) pLeft++;//相等会导致重复,
                    while (pLeft < pRight&&nums[pRight] == nums[pRight - 1]) pRight--;
                    pLeft++;//while循环跳出时,pLeft还是为原来一系统相等的值的最后一个,因此需要再移动一位
                    pRight--;
                }
                else if (sum < 0) {
      pLeft++; }//小于0,左指针前移
                else {
      pRight--; }//右指针后移
            }
        }
        return ans;

    }
};

你可能感兴趣的:(【魂】算法,leetcode,数组,双指针)