参考资料
在二分查找的过程中, 如何确定下界L
以及上界R
是十分关键的.
假设我们要求的是符合条件的答案中的最大值,
我们把所有符合条件的答案称为可行解, 可行解中的最大值称为最优解.
二分答案的基本思想
我们首先把下界L
赋值为答案的可能取值范围中的最小值(一定符合条件), 把上界R
赋值为答案的可能取值范围中的最大值(不一定符合条件), 然后令mid = (L+R)/2
.
- 若
mid
符合条件, 说明mid
为该问题的可行解, 则最优解一定落在[mid, R]
之内 - 若
mid
不符合条件, 则最优解一定落在[left, mid)
之内
一种正确的上下界确定方式
定义一个变量ans
用于存储答案. 假设此时的二分区间为[L, R]
, 代表程序在此区间内搜索比ans
更大的可行解,
- 若
mid
为可行解, 更新答案ans = mid
, 同时更新下界L = mid+1
- 若
mid
不为可行解, 更新上界R = mid-1
直到L > R
时跳出循环, ans即为最优解
代码框架:
while(L <= R){
int mid = (L+R)>>1;
if(judge(mid)){ //判断mid是否为可行解
ans = mid;
L = mid+1;
}
else R = mid-1;
}