誰讓我菜呢,第一反應就是要暴力解,三次循環,但是會遇到一個問題,因爲需要去除輸出中的重複項。看了大神的解答,才瞭解了雙指針的方法,但是對重複項的去除,還是一個需要詳細思考的問題。這道題其實對我最大的啓發,應該是排序的使用吧,因爲之前也考慮過用雙指針,但是如果沒有排序的話,沒辦法提升效率。
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;
}
};