之前谈的都是查找某个特定值,这里主要是谈论最小化最大值和最大化最小值问题。二分问题最容易搞错的就是终止条件,区间形式,返回lb还是ub或者需不需要再加减一。这里列出了模板
一:整型数二分
1.最小化最大值问题
形式一:(ub - lb) > 1 区间为 (lb, ub] 结果为 ub
while (ub - lb > 1) {
int mid = lb + (ub - lb) / 2;
if (C(mid))
ub = mid;
else
lb = mid;
}
// 终止循环时 ub == lb + 1
形式二: (ub - lb) > 0 区间为 [lb, ub] 结果为 ub
while (ub - lb > 0) {
int mid = lb + (ub - lb) / 2;
if (C(mid))
ub = mid;
else
lb = mid + 1;
}
// 终止循环时 ub == lb
2.最大化最小值问题
形式一:(ub - lb) > 1 区间为 [lb, ub) 结果为 lb
while (ub - lb > 1) {
int mid = lb + (ub - lb) / 2;
if (C(mid))
ub = mid;
else
lb = mid;