Two Sum (LeetCode)
2015-07-09 22:44
176 查看
题目:这个函数twosum应该返回两个数字,他们总计达目标指数,其中指数必须小于指数。请注意,你的答案返回(包括指数和指数)不为零的基础。
解法一:
解法一虽然能够解决这个问题,但是算法的时间复杂度为O(N^2),有些愚蠢
运行时间如下所示:
解法二:
解法二的时间复杂度为O(N),运行时间如下所示
解法二的思路是:循环遍历数组,每次都判断当前数组索引位置的值在不在HashMap里,不在的话,加入进去,key为数值,value为它的索引值;在的话,取得他的key,记为n(此时n一定小于循环变量i),接下来再在HashMap中查找(target-当前数值)这个数,利用了HashMap中查找元素时间为常数的优势,如果找到了就结束,此处需要注意的是,如果数组中有重复的值出现,那么第二次出现时就不会加入到HashMap里了,比如3,4,3,6;target=6时,当循环到第二个3时,也可以得到正确结果。
总结:读完题首先想到的就是两层遍历法,但是显然时间复杂度太高,是O(N^2),不符合要求,于是就应该想如何降低复杂度,首先应该想将逐个比较转变为直接查找,即首先计算出 target与当前元素的差,然后在序列中寻找这个差值,这样首先就把问题简化了,而寻找的过程可以先对序列进行快排,然后二分查找,这样整体的复杂度就降低为 O(N*logN) 了;查找最快的方法是利用一个
map容器存储每个元素的索引,这样取得某个特定元素的索引只需要常数时间即可完成,这样就更快了,最多只需遍历一次序列,将元素及其索引加入map中,在遍历的过程中进行对应差值的查找,如果找到了就结束遍历,这样时间复杂度最多为 O(N)。
这个题在今年的阿里的实习招聘笔试中出现过,当时问的是时间复杂度是多少(当时知道肯定不是O(N^2),所以猜了个O(Nlog2N),也是醉了。。。)。
解法一:
解法一虽然能够解决这个问题,但是算法的时间复杂度为O(N^2),有些愚蠢
运行时间如下所示:
解法二:
解法二的时间复杂度为O(N),运行时间如下所示
解法二的思路是:循环遍历数组,每次都判断当前数组索引位置的值在不在HashMap里,不在的话,加入进去,key为数值,value为它的索引值;在的话,取得他的key,记为n(此时n一定小于循环变量i),接下来再在HashMap中查找(target-当前数值)这个数,利用了HashMap中查找元素时间为常数的优势,如果找到了就结束,此处需要注意的是,如果数组中有重复的值出现,那么第二次出现时就不会加入到HashMap里了,比如3,4,3,6;target=6时,当循环到第二个3时,也可以得到正确结果。
总结:读完题首先想到的就是两层遍历法,但是显然时间复杂度太高,是O(N^2),不符合要求,于是就应该想如何降低复杂度,首先应该想将逐个比较转变为直接查找,即首先计算出 target与当前元素的差,然后在序列中寻找这个差值,这样首先就把问题简化了,而寻找的过程可以先对序列进行快排,然后二分查找,这样整体的复杂度就降低为 O(N*logN) 了;查找最快的方法是利用一个
map容器存储每个元素的索引,这样取得某个特定元素的索引只需要常数时间即可完成,这样就更快了,最多只需遍历一次序列,将元素及其索引加入map中,在遍历的过程中进行对应差值的查找,如果找到了就结束遍历,这样时间复杂度最多为 O(N)。
这个题在今年的阿里的实习招聘笔试中出现过,当时问的是时间复杂度是多少(当时知道肯定不是O(N^2),所以猜了个O(Nlog2N),也是醉了。。。)。
相关文章推荐
- jsp如何获取servlet的值
- java反射调用String[] wrong number of arguments异常解决
- 注解和XML的使用选择
- Android 高通平台Camera录制--MPEG4Writer.cpp 简单跟读
- ISO/IEC 9899:2011 条款6.2.4——对象的存储持久性
- 快速排序
- jQuery获取select中所有option值
- jQuery获取select中所有option值
- jQuery获取select中所有option值
- CAEmitterLayer 粒子效果
- 数组与指针
- 经验之谈
- soapUI-Pro-4.5.0破解方法
- 发现一个强大的MyEclipse破解器
- 数组、一维数组、二维数组
- 横向Linearlayout中TextView文字不能水平居中的解决方法
- Android 常用开发工具以及Mac常用软件
- 1.《Java学习路径》
- Insert Interval
- PayPal高级工程总监:读完这100篇论文 就能成大数据高手