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)

posted @ 2015-06-23 14:02  影翕  阅读(355)  评论(0编辑  收藏  举报