二分查找
基础思想
对于一个 (非严格)单调 序列,我们可以采用二分查找的方法在
O
(
l
o
g
2
n
)
内
O(log_2n)内
O(log2n)内寻找出某个元素的位置。
一般的代码是:
//对于非升序列A
int l = 1, r = n;
while(l <= r) {
int m = (l + r) / 2;
if(A[m] == k) {
ans = m;
break;
}
if(A[m] < k)
l = m + 1;
else r = m - 1;
}
写二分时,最麻烦的不是其本身,还是初始边界(l、r的初始值的确定)和结束条件(while
的括号里的内容),这些需要我们多加考虑。多测试,多手玩,就不会出错。
例题
这玩意没啥例题
二分答案
具体过程
二分答案和二分查找很像,当答案有单调性时可以使用它。
具体代码
//对于答案有非升的单调性
//即对于m答案成立的话,(1~m-1)一定成立
int l = 1, r = n;
while(l <= r) {
int m = (l + r) / 2;
if(check(m)) {
ans = m;
l = m + 1;
}
else r = m - 1;
}
类似地,考虑边界与l、r的变化!多测试,多手玩!
二分答案例题
LGOJ P1182 数列分段 Section II
LGOJ P1462 通往奥格瑞玛的道路
LGOJ P2678 跳石头
LGOJ P3957 跳房子