15. 3Sum
仅供自己学习
思路:
同题“4sum”,为了避免(1,-1,0)和(1,0,-1)这类的重复情况出现,如果用hash表存储,那么如果用hash[1-1]存放{1,-1},hash[1+0]存放{1,0},当前者遍历遇到0后会存储,后者遍历遇到-1后也会存储,这就会导致重复,如果对这类重复进行处理将会变得复杂。
所以我们可以考虑给nums数据排序,这样就能让重复的元素连在一起,并且运用双指针。和4sum相同 固定一个指针a在第一个元素,然后b=a+1,c=n-1。每次a+1,b+1,后就判断是否与前一个元素相等,如果相等就继续加直到不是重复的元素。当b这么做后,就能保证nums[b]+nums[c]不会重复等于target,并不需要在给c判断。
每次a+1后 就让target=-nums[a],并定义c=n-1,在循环b=a+1,循环条件为b<nums.size,然后如果nums[b]+nums[c]>target,那么就c--,就能让大小降下来。如果b==c,就结束这次循环,如果nums[b]+nums[c]=target,就加入进res。
代码:
1 class Solution { 2 public: 3 vector<vector<int>> threeSum(vector<int>& nums) { 4 vector<vector<int>> res; 5 sort(nums.begin(),nums.end()); 6 int size=nums.size(); 7 int target=0; 8 for(int a=0;a<size;a++){ 9 if(a>0&&nums[a]==nums[a-1]) continue; 10 target =-nums[a]; 11 int c=size-1; 12 for(int b=a+1;b<size;++b){ 13 if(b>a+1&&nums[b]==nums[b-1]) continue; 14 while(b<c&&nums[b]+nums[c]>target) --c; 15 if(b==c) break; 16 if(nums[b]+nums[c]==target) 17 res.push_back({nums[a],nums[b],nums[c]}); 18 } 19 } 20 return res; 21 } 22 };