先将数组进行排序
从左侧开始,选定一个值为 定值 ,右侧进行求解,获取与其相加为 0 的两个值
类似于快排,定义首和尾
首尾与 定值 相加
等于 0,记录这三个值
小于 0,首部右移
大于 0,尾部左移
定值右移,重复该步骤
class Solution {
public:
vector<vector<int>> threeSum(vector<int>& nums) {
sort(nums.begin(), nums.end());
int N = nums.size();
vector<vector<int> > res;
for (int i = 0; i <= N - 2; ++i) {
if(nums[i] > 0) break;
if(i > 0 && nums[i] == nums[i-1]) continue;
int l = i+1;
int r = N-1;
while(l < r){
int s = nums[i] + nums[l] + nums[r];
if(s > 0){
r--;
}
else if(s < 0){
l++;
}
else{
res.push_back({nums[i],nums[l],nums[r]});
while(l < r && nums[l] == nums[++l]);
while(l < r && nums[r] == nums[--r]);
}
}
}
return res;
}
};