原题链接:Leecode 15. 三数之和
我开始用了个dfs写,,,交上去,超时。。
但我想这,也就3个不通过,我再剪剪枝,于是,开启了漫长的剪枝道路,然而还是超时。
学习别人的题解(双指针):Leecode 15. 三数之和 排序 + 双指针
class Solution {
public:
vector<vector<int>> res;
vector<vector<int>> threeSum(vector<int>& nums) {
if(nums.size()<3)
return res;//数组长度小于3直接输出[]
sort(nums.begin(),nums.end());
//如果所有的数都>0,那么不可能有三数之和等于0
//这里不能写成>=0,因为有可能数组全为0
if(nums[0]>0)
return res;
int i=0,n=nums.size();
for(int i=0;i<n;i++)
{
if(nums[i]>0)//排过序的数组,从大于0的数开始往后,不可能出现三数之和等于0
break;
if(i > 0 && nums[i] == nums[i-1])//去重
continue;
int l=i+1,r=n-1;
while(l<r)
{
if(nums[i]+nums[l]+nums[r]==0)
{
res.push_back({nums[i],nums[l],nums[r]});
//去重
while(l<r && nums[l]==nums[l+1])
l++;
while(l<r && nums[r]==nums[r-1])
r--;
l++;r--;
}
//和大于 0,说明 nums[r]太大,r 左移
else if(nums[i]+nums[l]+nums[r]>0)
r--;
//和小于 0,说明 nums[l]]太小,l右移
else
l++;
}
}
return res;
}
};