这道题采取哈希法有点复杂,这里我们采取双指针的做法,首先对数组进行排序,遍历i,设置left和right指针,left为i右边的第一个元素,right为数组最后一个元素,即为最大值,让三者的元素值相加,若大于0,则right--,小于0,就left++,等于0,则可以加入到返回数组中,注意,当i的值大于0时,三者相加不可能等于0,直接退出。
去重操作:当num【i】==num【i-1】时候continue,不选择加一是因为会把000这种可行解排除
class Solution { public: vector<vector<int>> threeSum(vector<int>& nums) { sort(nums.begin(),nums.end()); vector<vector<int>> res; int n=nums.size(); for(int i=0;i<n-2;i++){ if(nums[i]>0){ return res; } if(i>0&&nums[i]==nums[i-1]){ continue; } int left=i+1; int right=n-1; while(left<right){ if(nums[i]+nums[left]+nums[right]==0){ res.push_back({nums[i],nums[left],nums[right]}); while(right>left&&nums[right]==nums[right-1]){ right--; } while(right>left&&nums[left]==nums[left+1]){ left++; } right--; left++; } else if(nums[i]+nums[left]+nums[right]>0){ right--; } else if(nums[i]+nums[left]+nums[right]<0){ left++; } } } return res; } };