难度:中等
该题为基础常考题:
由上图中例一可以得出,如果给出的数组是[-1,0,1,2,-1,-4]这个,其中有两个-1,那么正确答案就可以是[-1,0,1],[-1,0,1],[-1,-1,2]其中前俩个数组答案一样,因为有重复的-1,所以答案得去重,去重之后对得到的合适的答案进行填入,下面进行代码填充,思路会写入到代码注释中。
class Solution {
public:
vector<vector<int>> threeSum(vector<int>& nums) {
vector<int> vec;
if (nums.size() < 3 || nums.empty()) return vec;
int size = nums.size();
sort(nums.begin(), nums.end());
for (int i = 0; i < size; ++i)
{
if (nums[i] > 0) return vec;
if (i > 0 && nums[i] == nums[i - 1]) continue; //去重当前遍历最小值
int L = i + 1, R = size - 1; //L和R分别指向去除i的最左边和最右边
while (L < R)
{
int tmp = nums[i] + nums[L] + nums[R];
if (tmp > 0) //大于零的话 R向左移动
{
R--;
}
else if (tmp < 0) //因为已经排序好了 整体小于0的话 左指针向右移动
{
L++;
}
else //三数之和为0
{
vec.push_back({ nums[i],nums[L],nums[R] });
while (L < R && nums[L] == nums[L + 1]) L++; //这块为什么还要进行去重的操作?例如[-3,-1,-1,4,4]
while (L < R && nums[R] == nums[R - 1]) R--; //以上述的数组为例 如果不去重的话 还是会出现重复答案
L++;
R--;
}
}
}
return vec;
}
};
视频讲解来自于b站一位up主:LeetCode 15. 3Sum_哔哩哔哩_bilibili