二分查找,边界问题,原理很简单,但上界下界等很绕,模板又多,需要一个万能模板。
步骤
- 建模,划分蓝红区域,确定IsBlue()
- 确定返回是l和r
- 套用以下算法模板
int find_upper_bound(int l, int r) {
int left = l - 1, right = r + 1; //初始化为边界之外
while (left + 1 != right) {
int m = left + right >> 1;
if (isBlue(m))
left = m;
else
r = m;
}
return left or right;
}
举例如图
(注意)缺点:
观察n的边界,当n为2147483647,n+1会溢出,因此当题目给的边界为n可能为极大值时,需要改变算法模板,如:
int find_upper_bound(int l, int r) {
int left = l - 1, right = r + 1; //初始化为边界之外
if (n>=10){
left = l;
right = r;
}
while (left + 1 != right) {
int m = left + right >> 1;
if (isBlue(m))
left = m;
else
r = m;
}
return left or right;
}
参考:https://www.bilibili.com/video/BV1d54y1q7k7/?vd_source=371055ec4650ccbe8e4a4594e3a52d37