15 3Sum(寻找三个数之和为指定数的集合Medium)
题目意思:给一个乱序数组,在里面寻找三个数之和为0的所有情况,这些情况不能重复,增序排列
思路:前面2sum,我用的是map,自然那道题map比双指针效率高,这道题需要先排序,再给三个指针,i、j、k
对于i指针从前往后遍历,对于一个固定的i指针,其实就是2Sum的情况,给定一前一后两个指针进行遍历,
值大了,就把后面的指针往前移,值小了就把前面的指针往后移。
比较麻烦的地方在于去重,首先是i指针的去重,j和k只用一个去重就可以了
ps:这是数组中一种十分常用的方法。
1 class Solution { 2 public: 3 vector<vector<int>> threeSum(vector<int>& nums) { 4 vector<vector<int>> ans; 5 vector<int> temp(3); 6 int size=nums.size(); 7 int j,k; 8 sort(nums.begin(),nums.end()); 9 for(int i=0;i<size-2;++i){ //注意这种位置可以写nums.size(),就是不能写nums.size()-2,什么原因我还没搞明白 10 //while(i>0&&nums[i]==nums[i-1])++i; 注意比较两种写法 11 if(i>0&&nums[i]==nums[i-1])continue; 12 j=i+1; 13 k=size-1; 14 while(j<k){ 15 if(j>i+1&&nums[j]==nums[j-1]){ 16 ++j; 17 continue; 18 } 19 if(nums[j]+nums[k]>-nums[i])--k; 20 else if(nums[j]+nums[k]<-nums[i])++j; 21 else{ 22 temp[0]=nums[i]; 23 temp[1]=nums[j]; 24 temp[2]=nums[k]; 25 ans.push_back(temp); 26 ++j; 27 --k; 28 } 29 } 30 } 31 return ans; 32 } 33 };
复杂度:O(n2)