博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
leetcode 167 Two Sum II - Input array is sorted
阅读量:6441 次
发布时间:2019-06-23

本文共 1484 字,大约阅读时间需要 4 分钟。

给定一个有序的数组,和一个整数目标,求两个数的和等于目标的索引,索引从1开始。假设必定存在解。

有两种思路:

直接找:

vector
twoSum(vector
& numbers, int target) { int s = 0, e = numbers.size() - 1; while (true) { if (numbers[s] + numbers[e] > target) e--; else if (numbers[s] + numbers[e] < target) s++; else { return vector
{s + 1, e + 1}; } } }

原理显而易见,最坏情况,也就O(n),当两个索引位于中间位置。

二分查找:

vector
twoSum(vector
& numbers, int target) { auto tail = upper_bound(numbers.begin(), numbers.end(), target); auto start = numbers.begin(); for (;start != tail;) { int other = target - *start; ++start; tail = lower_bound(start, tail, other); if (other == *tail) { vector
ret = {start - numbers.begin(), tail - numbers.begin() + 1}; return move(ret); } other = target - *tail; --tail; start = lower_bound(start, tail, other); if (other == *start) { vector
ret = {start - numbers.begin() + 1, tail - numbers.begin() + 2}; return move(ret); } } }

每次都是二分地前进后退,最坏情况下达到O(nlogn),当两索引位于中间。

但当两个答案靠近某一端时性能较好。就leetcode结果来看,相差不大。

转载于:https://www.cnblogs.com/willaty/p/8376786.html

你可能感兴趣的文章
出现访问apache资源直接下载php文件的解决办法-----yum 安装 php mysql
查看>>
七种Mysql表类型
查看>>
归并与归并排序
查看>>
linux和windows互传文件、用户配置文件和密码配置文件、用户组管理、用户管理...
查看>>
spark 应用程序性能优化经验
查看>>
基于Zabbix IPMI监控服务器硬件状况
查看>>
Go语言之并发资源竞争
查看>>
mac本显示隐藏文件或关闭显示隐藏文件
查看>>
spring4.0 整合 Quartz 实现任务调度(一)
查看>>
android复杂布局的一点思路
查看>>
Awesome Python
查看>>
java web简单权限管理设计
查看>>
Google Analytics
查看>>
【转】什么是云计算
查看>>
MySQL 5.7及以上解压缩版本配置安装
查看>>
Extjs4.0 Chart属性中文解释
查看>>
PHP单例模式的实现
查看>>
httpClient post 数据传输和处理
查看>>
newLISP你也行 --- 字符串
查看>>
【译】Swift 2.0 下面向协议的MVVM架构实践
查看>>