🔗 leetcode.cn/problems/3s…
题目
- 给出一个数组,返回数组中的三个不同下标的 item 之和为 0 的所有元素组合,即三元组为 {nums[i], nums[j], nums[k]},去重后返回
思路
- 数组排序,按照顺序遍历,固定数字 a,two pointer 分别从剩余数组的头尾找 b 和 c,找到满足 a+b+c 的元素
- 数组排序后,在固定 a 的情况下,b 逐渐增大,若要满足 a+b+c == 0,c 就逐渐减小,以此优化循环遍历的元素个数
- 为了保证去重,a 和 b 使用之后,下一轮循环跳过相同元素
代码
class Solution {
public:
vector<vector<int>> threeSum(vector<int>& nums) {
vector<vector<int>> ans
sort(nums.begin(), nums.end())
for (int i = 0
if (i && nums[i] == nums[i - 1]) continue
int k = nums.size() - 1
for (int j = i + 1
if (j > i + 1 && nums[j-1] == nums[j]) continue
while (k > j && nums[i] + nums[j] + nums[k] > 0) k--
if (k > j && nums[i] + nums[j] + nums[k] < 0) continue
if (k > j && nums[i] + nums[j] + nums[k] == 0) ans.push_back({nums[i], nums[j], nums[k]})
}
}
return ans
}
}