第一类模板
(l <= r)型
int l = 0, r = 1e9;// l 和 r 的取值选择按照具体题目条件,此处只是示例。
while (l <= r) {
int mid = (l + r) / 2;
if (check(mid)) {
l = mid - 1;//也有可能是 r = mid + 1;
}
else {
r = mid + 1;//也有可能是 l = mid - 1;
}
}
cout << l << endl;//注意是输出每次check对应的边界,在此处为l
每次检查mid值是否符合标准,如果符合标准,则调整边界(需按照题目条件灵活调整,有些时候需要调整左边界或者右边界)。使mid值不断逼近答案,最终当 l > r 时则表示已经完成,此时 l 的值就是目标值。
第二类模板
(r - l > 1)型
ll l = 0, r = 1e9;
while (r - l > 1) {
int mid = (l + r) / 2;
if (check(mid)) l = mid;
else r = mid;
}
cout << l << endl;
这个模板与上面的模板主要逻辑一致,都是不断调整边界,逼近答案,最重要的区别在于while循环的终止条件,区别在于有重复元素时,使用第二类模板确定边界更合适。