思路
固定一个数c,然后遍历前面的数使其和为-c
转化问题为双指针求和为target=-nums[c]
把三数之和的问题转化为两数之和
#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
class Solution {
public:vector<vector<int>> threeSum(vector<int>& nums) {vector<vector<int>> ret;//创建一个二维数组用于返回if (nums.size() < 3) return ret; //数组元素小于3直接返回空数组sort(nums.begin(), nums.end());//先排序int left = 0, c = nums.size() - 1, right = c - 1; //固定c,遍历前面的数,使其和为-cwhile (c >= 2){int target = -nums[c];//特别特别注意!!!这里一定要更新left和right,不然会有遗漏的解left = 0, right = c - 1;while (left < right){if (nums[left] + nums[right] < target)left++;else if (nums[left] + nums[right] > target)right--;else{ret.push_back({ nums[left],nums[right],nums[c] });left++; right--;while (left < right && nums[left] == nums[left - 1]) left++;//遇到相同的数直接跳过,避免重复解while (left < right && nums[right] == nums[right + 1]) right--;}}c--;while (c >= 2 && nums[c] == nums[c + 1])c--;//c遇到相同的数也要跳过!}return ret;}
};