15、三数之和

发布时间 2024-01-07 16:03:24作者: 不是孩子了

//三数之和
#include<iostream>
#include<string>
#include<vector>
#include<algorithm>
using namespace std;

vector<vector<int>> threeSum(vector<int>& nums) {
    vector<vector<int>> result;
    sort(nums.begin(), nums.end());//数组排序

    for(int i = 0; i<nums.size(); i++){
        //剪枝,避免都是重复元素超时
        if (i>0 && nums[i] == nums[i-1])
        {
            continue;
        }
        
        int start = i+1, end = nums.size()-1;
        while(start<end){
            int sum = nums[i] + nums[start] + nums[end];
            if (sum == 0)
            {
                vector<int> v;
                v.push_back(nums[i]);
                v.push_back(nums[start]);
                v.push_back(nums[end]);

                result.push_back(v);
                start++;
            }else if (sum>0)
            {
                end--;
            }else if (sum<0)
            {
                start++;
            }
        }
    }

    //对vector去重
    sort(result.begin(), result.end());
    result.erase(unique(result.begin(), result.end()), result.end());

    return result;
}

int main()
{
    vector<int> nums;
    nums.push_back(-1);
    nums.push_back(0);
    nums.push_back(1);
    nums.push_back(2);
    nums.push_back(-1);
    nums.push_back(-4);

    threeSum(nums);

    
}

算法思想:

  1. 也是运用双指针,先对数组进行排序
  2. 难点在于:
  3. ①、对vector去重
    
  4. ②、剪枝