二分查找的优雅写法
根据返回值的要求不同,二分查找有以下几种(假定我们在一个整数数组中查找某个value)
0 二分查找的分类
有下面几种形式的要求:
- 如果存在,返回true,否则返回false。
- 如果存在,返回第一次出现的索引值,否则返回-1。
- 如果存在,返回第一次出现的索引值,否则返回-(1 + 可插入的位置)。可插入的位置指的是第一个大于等于查找值位置的索引。
- 如果存在,返回第一次出现的索引和最后一次出现的索引,否则返回
[-1, -1]
。
所有的要求都可以用下面将要讲到的lower
和upper
函数解决:
1 求第一个大于等于查找值的位置
我们在前开后闭区间[first, last)
中递归地查找,返回第一个大于等于value
的位置;如果所有数字都小于value
,那么返回last
。
这个返回值实际上也是value
应该插入的位置。
int lower(int[] array, int value) {
int first = 0, last = array.length;
while (first < last) {
// 当[fisrt, last)非空时
int mid = first +