三数之和
题目链接:https://leetcode-cn.com/problems/3sum/
思路:排序+双指针,同时注意去重。固定指向最小数字的指针i
- (剪枝)若nums[i] > 0,则直接结束
- (去重)若nums[i] == nums[i - 1],++i
(i, nums.size())区间内双指针j, k在j < k的情况下遍历:
- 若三数之和< 0,j++并跳过所有重复元素
- 若三数之和>0,k—并跳过所有重复元素
- 若三数之和=0, 存储该元组并j++ k—跳过所有重复元素
参考代码
class Solution {
public:
vector<vector<int>> threeSum(vector<int>& nums) {
vector<vector<int>> res;
if (nums.size() < 3) {
return res;
}
sort(nums.begin(), nums.end());
for (int i = 0; i < nums.size() - 2; ++i) {
if (i > 0 && nums[i] == nums[i - 1]) {
continue;
}
if (nums[i] > 0) {
break;
}
int j = i + 1;
int k = nums.size() - 1;
while (j < k) {
int s = nums[i] + nums[j] + nums[k];
if (s < 0) {
do {
++j;
} while (j < k && nums[j] == nums[j - 1]);
}
else if (s > 0) {
do {
--k;
} while (j < k && nums[k] == nums[k + 1]);
}
else {
vector<int> ans = {nums[i], nums[j], nums[k]};
res.push_back(ans);
do {
++j;
} while (j < k && nums[j] == nums[j - 1]);
do {
--k;
} while (j < k && nums[k] == nums[k + 1]);
}
}
}
return res;
}
};