15 3Sum(寻找三个数之和为指定数的集合Medium)
2015-06-23 14:02
197 查看
题目意思:给一个乱序数组,在里面寻找三个数之和为0的所有情况,这些情况不能重复,增序排列
思路:前面2sum,我用的是map,自然那道题map比双指针效率高,这道题需要先排序,再给三个指针,i、j、k
对于i指针从前往后遍历,对于一个固定的i指针,其实就是2Sum的情况,给定一前一后两个指针进行遍历,
值大了,就把后面的指针往前移,值小了就把前面的指针往后移。
比较麻烦的地方在于去重,首先是i指针的去重,j和k只用一个去重就可以了
ps:这是数组中一种十分常用的方法。
复杂度:O(n2)
思路:前面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)
相关文章推荐
- linux grep命令使用的一些心得
- 64位开源处理器Rocket的源代码简单介绍
- CV各技术论坛及QQ群
- Android中的Interpolator
- QTPtest中Action种类
- Linux ALSA声卡驱动之四:Control设备的创建
- 第三个sprint冲刺第三阶段
- php 登陆后台验证代码
- Linux ALSA声卡驱动之三:PCM设备的创建
- 使用.bat文件运行ant的build.xml
- SynEdit(Delphi XE7)的安装和基本使用
- 第三个sprint冲刺第二阶段
- php 5.3 配置mssql笔记
- 那个革新的中国电信,是如何英雄气短
- Linux ALSA声卡驱动之二:声卡的创建
- 判断是什么浏览器
- 英语查询小编程
- linux 中查看cpu的信息
- Behavioral模式之template Method模式
- 让IE6 IE7 IE8 IE9 IE10 IE11支持Bootstrap的解决方法