题解 | #三数之和# 双指针 秒
三数之和
https://www.nowcoder.com/practice/345e2ed5f81d4017bbb8cc6055b0b711
class Solution {
public:
// 官解 效率更高的 双指针法
vector<vector<int> > threeSum(vector<int> &num) {
int n = num.size();
if(n<=2)
return {};
sort(num.begin(), num.end());
vector<vector<int>> ans;
// 最外层枚举a
for(int i = 0; i<n-2; ++i)
{
// 注意去重
if(i!=0 && num[i]==num[i-1])
continue; // 否则之后两个数字的组合会重复
int a=num[i];
// 之后用双指针
int left = i+1;
int right = n-1;
// b+c的值
int t = -a;
while(left<right)
{
if(num[left]+num[right] == t)
{
ans.push_back({a, num[left], num[right]});
while(left+1<right && num[left]==num[left+1])
left++; // 跳过相连企鹅相等的
while(left<right-1 && num[right-1]==num[right])
right--;
//用完一次后 收缩
left++;
right--;
}
else if(num[left] + num[right]>t)
{
// 偏大 那就减小 r左移
right--;
}
else
{
left++;
}
}
}
return ans;
}
};
里面去重的思路 我得再试试
