二分查找 (最经典代码,及其边界条件的实践分析)
2016-06-12 17:01
246 查看
(注: 原创博客,转载请引用 http://www.cnblogs.com/wubdut/p/5578147.html)
代码举例: Array递增,找第一个不小于target的下标。
int theIndex(vector<int> Array) {
int lo = 0, hi;
while (lo <= hi) {
int mid = (lo+hi)/2;
if (target > A[mid]) lo = mid+1; /// (1)
else hi = mid-1; // (2)
}
return lo; // (3)
}
解析: 本段代码引自LeetCode。这是一段非递归的二分查找的代码,其核心代码只有4行, 看起来十分简单,又好理解,但要想在实践中灵活运用并不容易。问题当让出在边界条件,总结为两条:
a. (1)和(2)哪个包含“=”;
b. 返回lo还是hi。
问题a: 只有通过边界检测来完成,将mid-1,mid,mid+1,target设相同值x,结合实际条件判断等号位置;
问题b: so easy 啦!!!等号不是谁的,就返回谁。以后妈妈再也不用担心我死记硬背二分了(^_^)
代码举例: Array递增,找第一个不小于target的下标。
int theIndex(vector<int> Array) {
int lo = 0, hi;
while (lo <= hi) {
int mid = (lo+hi)/2;
if (target > A[mid]) lo = mid+1; /// (1)
else hi = mid-1; // (2)
}
return lo; // (3)
}
解析: 本段代码引自LeetCode。这是一段非递归的二分查找的代码,其核心代码只有4行, 看起来十分简单,又好理解,但要想在实践中灵活运用并不容易。问题当让出在边界条件,总结为两条:
a. (1)和(2)哪个包含“=”;
b. 返回lo还是hi。
问题a: 只有通过边界检测来完成,将mid-1,mid,mid+1,target设相同值x,结合实际条件判断等号位置;
问题b: so easy 啦!!!等号不是谁的,就返回谁。以后妈妈再也不用担心我死记硬背二分了(^_^)
相关文章推荐
- Java读取/写入Yaml配置文件
- Java JDK1.8新特性Lambda 表达式
- python写xml
- eclipse插件大全
- SpringMvc登录检查
- PHP设计模式之装饰器模式
- 《深入理解Java虚拟机》Java内存区域与内存溢出异常
- spring boot使用mongo:code1
- windows搭建python环境之MySQLdb
- 解决:使用java连接Fastdfs,上传文件时报:SocketTimeOutException的问题.
- 一个高级PHP工程师所应该具备的
- C#做园区规划设计论坛服务系统笔记
- 知道这20个正则表达式,能让你少写1,000行代码
- Spring4 MVC json问题(406 Not Acceptable)
- C#多线程编程总结
- eclipse调试查看属性值的小技巧
- hjr-PHP:phpstorm使用
- python中通信模块
- 如何判断对象已死
- C#Winform动态调整FlowLayoutPanel的控件中位置