解析:K-sums系列问题,采用定位法,确定边缘,往中间靠拢
1.排序,将头尾的数确定,利用下标记录当前的位置,若当前数大于0,表示3个数相加一定大于0,结束
2.若当前不是第1个数,判断和前面一个数是否重复
3.若当前3个数的和大于0,最高位往左移动;小于0,最低位往右移动;如等于0,
保存记录,并分别扫描左右两位是否重复
class Solution {
public:
vector<vector<int>> threeSum(vector<int>& nums) {
vector<vector<int>> res;
int n = nums.size();
sort(nums.begin(), nums.end());
for (int i = 0; i < n; ++i){
if (i > 0 && nums[i] == nums[i-1]) continue;
int j = i + 1;
int k = n - 1;
while (j < k){
if (nums[i] + nums[j] + nums[k] > 0){
k--;
}
else if (nums[i] + nums[j] + nums[k] < 0){
j++;
}
else{
res.push_back({nums[i], nums[j], nums[k]});
while (j < k && nums[j] == nums[j+1]) ++j;
while (j < k && nums[k] == nums[k-1]) --k;
++j;
--k;
}
}
}
return res;
}
};
[1]https://www.cnblogs.com/grandyang/p/4481576.html