您的位置:首页 > 其它

15 3Sum(寻找三个数之和为指定数的集合Medium)

2015-06-23 14:02 197 查看
题目意思:给一个乱序数组,在里面寻找三个数之和为0的所有情况,这些情况不能重复,增序排列

思路:前面2sum,我用的是map,自然那道题map比双指针效率高,这道题需要先排序,再给三个指针,i、j、k

   对于i指针从前往后遍历,对于一个固定的i指针,其实就是2Sum的情况,给定一前一后两个指针进行遍历,

   值大了,就把后面的指针往前移,值小了就把前面的指针往后移。

   比较麻烦的地方在于去重,首先是i指针的去重,j和k只用一个去重就可以了

   ps:这是数组中一种十分常用的方法。

class Solution {
public:
vector<vector<int>> threeSum(vector<int>& nums) {
vector<vector<int>> ans;
vector<int> temp(3);
int size=nums.size();
int j,k;
sort(nums.begin(),nums.end());
for(int i=0;i<size-2;++i){     //注意这种位置可以写nums.size(),就是不能写nums.size()-2,什么原因我还没搞明白
             //while(i>0&&nums[i]==nums[i-1])++i;   注意比较两种写法
if(i>0&&nums[i]==nums[i-1])continue;
j=i+1;
k=size-1;
while(j<k){
if(j>i+1&&nums[j]==nums[j-1]){
++j;
continue;
}
if(nums[j]+nums[k]>-nums[i])--k;
else if(nums[j]+nums[k]<-nums[i])++j;
else{
temp[0]=nums[i];
temp[1]=nums[j];
temp[2]=nums[k];
ans.push_back(temp);
++j;
--k;
}
}
}
return ans;
}
};


   复杂度:O(n2)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: