谁让我菜呢,第一反应就是要暴力解,三次循环,但是会遇到一个问题,因为需要去除输出中的重复项。看了大神的解答,才了解了双指针的方法,但是对重复项的去除,还是一个需要详细思考的问题。这道题其实对我最大的启发,应该是排序的使用吧,因为之前也考虑过用双指针,但是如果没有排序的话,没办法提升效率。
class Solution {
public:
vector<vector<int>> threeSum(vector<int>& nums) {
vector<vector<int>> ret;
vector<int> vtemp;
int len=nums.size();
sort(nums.begin(),nums.end());
for(int i=0;i<len-2;i++)
{
if(i==0||(i>0&&nums[i]!=nums[i-1]))
{
int p1=i+1,p2=len-1;
while(p1<p2)
{
if(nums[p1]+nums[p2]<-nums[i])
{
p1++;
}
else if(nums[p1]+nums[p2]==-nums[i])
{
if(p1==i+1){
vector<int>vtemp{nums[i],nums[p1],nums[p2]};
ret.push_back(vtemp);
vtemp.clear();
}
else if(nums[p1]!=nums[p1-1]){
vector<int>vtemp{nums[i],nums[p1],nums[p2]};
ret.push_back(vtemp);
vtemp.clear();
}
p1++,p2--;
}
else p2--;
}
}
}
return ret;
}
};