二分查找的关键在于循环不变量(就是在while循环过程中不变的一些规定)
我的循环不变量:
1.区间开闭,我选择左闭右闭
2.循环结束条件:当前区间内没有元素
3.下一次二分查找区间:不能包含已经查找过的元素
4.返回值:大于等于target的第一个下标
有序数组中二分查找的四种类型(下面的转换仅适用于数组中都是整数)
- 第一个大于等于x的下标: low_bound(x)
- 第一个大于x的下标:可以转换为
第一个大于等于 x+1 的下标
,low_bound(x+1) - 最后一个小于x的下标:可以转换为
第一个大于等于 x 的下标
的左边位置
, low_bound(x) - 1; - 最后一个小于等于x的下标:可以转换为
第一个大于等于 x+1 的下标
的左边位置
, low_bound(x+1) - 1;
FQA:
1.如何理解最后一个小于x的下标等价于第一个大于等于 x 的下标的左边位置
假设index为最后一个小于x的下标,array[index]<x,因为它是最后一个小于x,所以array[index+1]>=x
这就转换成了情况1了,最后我们将求出的坐标减去1就是index了