【力扣hot100题】(005)三数之和
个人感觉这道题最大的难点在“不重复”。
一开始主要是在思考怎么实现“三指针”,后来想到可以遍历一遍数组,每一遍都当成是双指针就行了。
需要注意的是在每次遍历时一定要后移到与当前位置不相等的地方,不然就会重复。
然后对后面的数使用双指针时也要进行去重工作,在每次找到一个结果三元组后移动双指针时一定要将两个指针移动到与之前元素不等的位置,这样才能保证没有重复元素。
总之绕了不少弯路。
class Solution {
public:
vector<vector<int>> threeSum(vector<int>& nums) {
vector<vector<int>> result;
sort(nums.begin(),nums.end());
for(int i=0;i<nums.size();i++){
int front=i+1;
int back=nums.size()-1;
while(front<back){
if(nums[front]+nums[back]+nums[i]==0){
result.push_back(vector<int>{nums[i],nums[front],nums[back]});
while(front<back&&nums[front+1]==nums[front]) front++;
while(front<back&&nums[back-1]==nums[back]) back--;
front++;
back--;
}
else if(nums[front]+nums[back]+nums[i]<0) front++;
else if(nums[front]+nums[back]+nums[i]>0) back--;
}
while(i+1<nums.size()&&nums[i+1]==nums[i]) i++;
}
return result;
}
};