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 };

 

posted @ 2021-03-16 14:45  Mrsdwang  阅读(48)  评论(0编辑  收藏  举报