码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2015-06-23 15:27:04      阅读:109      评论:0      收藏:0      [点我收藏+]

标签:

题目意思:给一个乱序数组,在里面寻找三个数之和为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)

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

标签:

原文地址:http://www.cnblogs.com/smallby/p/4595318.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!