边界值left
和right
的初始值
例如在有序数组中查找指定值的下标时,可能的结果范围为[0, len-1],因此初始化时应该使用:
int left = 0, right = len - 1;
但在查找插入位置问题(在有序数组中,找到插入指定值
target
的下标)中,边界的下标取值范围是[0, len],即len
也在取值范围中,因此初始化时应当设置:int left = 0, right = len;
计算
mid
值
为了避免溢出,计算mid
通常使用:int mid = left + (right - left) / 2;
缩小边界 【二分查找的边界设定】通常需要使用一个
if...else...
语句来改变边界,最方便清晰的方法,是将arr[mid] < target
、arr[mid] == target
和arr[mid] > target
三种情况分别写出。例如,在查找插入位置问题中,我们需要找到第一个小于等于
target
值的位置,这时可以考虑几个条件:arr[mid] < target
: 这时左边界left
应该在mid
的右侧,因此应该取left = mid + 1
arr[mid] > target
: 这时右边界right
应该在mid
的左侧,因此应该取right = mid - 1
arr[mid] == target
: 这时mid
左侧仍可能存在与target
相等的元素,因此应使right = mid
if (arr[mid] < target) {
left = mid + 1;
} else if (arr[mid] == target){
right = mid;
} else {
right = mid - 1;
}
循环的条件 通常将循环条件设为
left < right
,这样当循环退出时,可以保证left == right
。避免无限循环
while (left < right) {
int mid = left + (right - left) / 2;
if (condition1) {
left = mid;
}
...
}
在上述代码中,若数组中只有两个元素,即
right == left + 1
的情况下,条件condition1
一直成立,这时mid == left
恒成立,left
一直得不到更新,始终满足while
循环的条件,就会造成死循环。因此可以通过下面的方式计算
mid
,以防出现死循环。int mid = left + (right - left + 1) / 2;
参考
- https://leetcode.com/problems...
推荐阅读
- LeetCode编程题解法汇总|力扣解法汇总2049-统计最高分的节点数目
- ESTR1002 2020
- 我也曾刷题刷到自闭
- Python数据结构与算法|Python数据结构与算法(3.1)——栈
- Go语言|【Golang】做算法题可能会用到的知识
- 简单搜索|Smallest Difference POJ-2718(全排列)
- 数据结构和算法|数据结构和算法
- MTH 4130数值分析
- 朝题夕解|朝题夕解——动态规划之整数划分模型