题目
排序 + 二重循环
考虑到会出现数字重复的情况,因此首先应该对数据进行排序,这样就能保证重复数字出现在相邻的位置上,进而在运算过程中可以将其去除。
由于排序后的数据满足从小到大的规律,因此前面两数之和的配对数字必然在后面,因此可以从前后两个方向进行查找。
在查找过程中,如果若三数之和大于 0 ,表示第三个数字偏大,此时需要向前遍历更小的数字;反之若小于 0 ,则表示没有三数之和等于 0 的情况。因此将所有三数之和等于 0 的数字找出即可。
在前两个数字遍历的过程中,若当前数字与前一个数字相同,则出现了重复数字的情况,应该忽略该数字,代码如下:
class Solution {
public:
vector<vector<int>> threeSum(vector<int>& nums) {
vector<vector<int>> res;
sort(nums.begin(), nums.end()); // 排序
for(int i = 0; i < nums.size(); ++i) {
int r = nums.size() - 1;
for(int l = i + 1; l < r; ++l) {
int tmp = nums[i] + nums[l];
while(r > l && tmp + nums[r] > 0) // 移动末尾指针
r--;
if(l < r && tmp + nums[r] == 0) // 记录输出
res.push_back(vector<int>{nums[i], nums[l], nums[r]});
while(l + 1 < r && nums[l] == nums[l + 1]) // 判断重复
l++;
}
while(i + 1 < nums.size() && nums[i + 1] == nums[i]) // 判断重复
i++;
}
return res;
}
};