三数之和
题目链接: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;}};
