快速寻找满足条件的两个数
2016-03-10 16:05
253 查看
问题:快速找出一个数组中的两个数字,让这两个数字之和等于一个固定值,为了简化起见,我们假设这个数组中肯定存在至少一组符合要求的解。
解法1:直接枚举,计算两两数字之和,时间复杂度为O(N2)。
解法2:找sum-arr[i]是否存在。
对于每个数字arr[i],查找应对的sum-arr[i]是否在数组中,那么关键就在于如何提高查找的效率。
为了提高查找效率,我们可以将数组排序,这需要O(N*log2N)的时间,使用二分查找等方法进行查找,需要O(log2N),总的时间复杂度是O(N*log2N)。
另外,还有更快的查找方法:Hash表。给定一个数字,根据hash映射查找另一个数字是否在数组中,只需用O(1)时间。但这种方法需要额外增加O(N)的hash表存储空间。总体的算法复杂度为O(N)。
解法3:当题目要求返回两个下标时,则比较高效的办法是:先排序,然后在一个循环体里使用两个循环变量进行反向遍历,并且这两个变量遍历的方向是不变的,从而保证遍历算法的时间复杂度为O(n)。
首先对数组进行排序,时间复杂度为O(N*log2N)。
令i=0,j=n-1,看arr[i]+arr[j]是否等于sum,如果是,则结束,如果小于sum,则i++,如果大于sum,则j--。这样只需要在排好的数组上遍历一次,就可以得到最后的结果。
资料整理自《编程之美》
解法1:直接枚举,计算两两数字之和,时间复杂度为O(N2)。
解法2:找sum-arr[i]是否存在。
对于每个数字arr[i],查找应对的sum-arr[i]是否在数组中,那么关键就在于如何提高查找的效率。
为了提高查找效率,我们可以将数组排序,这需要O(N*log2N)的时间,使用二分查找等方法进行查找,需要O(log2N),总的时间复杂度是O(N*log2N)。
另外,还有更快的查找方法:Hash表。给定一个数字,根据hash映射查找另一个数字是否在数组中,只需用O(1)时间。但这种方法需要额外增加O(N)的hash表存储空间。总体的算法复杂度为O(N)。
解法3:当题目要求返回两个下标时,则比较高效的办法是:先排序,然后在一个循环体里使用两个循环变量进行反向遍历,并且这两个变量遍历的方向是不变的,从而保证遍历算法的时间复杂度为O(n)。
首先对数组进行排序,时间复杂度为O(N*log2N)。
令i=0,j=n-1,看arr[i]+arr[j]是否等于sum,如果是,则结束,如果小于sum,则i++,如果大于sum,则j--。这样只需要在排好的数组上遍历一次,就可以得到最后的结果。
资料整理自《编程之美》
相关文章推荐
- Exchange2007升级到Exchange2013(7)——更改迁移并发数
- 实现DUBBO服务环境隔离
- Lucene4.7 索引和检索的常用API(二)
- 安卓模拟器BlueStacks+TCPdump对APP抓包分析
- 二分查找时间复杂度的计算
- 怎么使用js停止页面所有的加载
- aix下设置自动启动、关闭oracle
- i++
- HttpClient4.3教程 第二章 连接管理
- 几款开源的图形化Redis客户端管理软件
- SEVERE: ContainerBase.addChild: start: org.apache.catalina.LifecycleException:
- 利用java开源包进行短信的收发
- AMQP协议(经典)
- httpclient4.2.1最新版连接池配置
- Spark SQL小结
- lucene4.7 索引文件(九)
- Jedis 是 Redis 官方首选的 Java 客户端开发包
- XML fragments parsed from previous mappers already contains value for
- linux和windows文件名长度限制
- elasticsearch 乐观锁