二分
1. 算法分析
使用场景
使用二分需要满足单调性和连续性。
二分法常常用于:
- 题目有找最大/小的答案的字眼,这种情况直接枚举答案
- 计算出复杂度差不多是O(nlogn)时,考虑二分法
边界问题
- l和r的取法:l取可能取到值的左边界,r取可能取到值的有边界
- 判断是否找到答案:判断sum[l]和target的关系,如果相等,找到答案;不相等,找不到答案。
- 如果在while循环内找到答案怎么处理:答案的那个等于符号放到if()里面,因为判断到答案的时候r = mid 或 l = mid。
2. 板子
2.1 整数二分
2.1.1 找大于某个数的最小值
int bsearch_1(int l, int r) {
while (l < r) {
int mid = (l + r) >> 1; // 区别:有无加1
if (check(mid)) r = mid; //区别
else l = mid + 1; //区别
}
return l;
}
2.1.2 找小于某个数的最大值
int bsearch_2(int l, int r) {
while (l < r) {
int mid = (l + r + 1) >> 1; // 区别:有无加1
if (check(mid)) l = mid; //区别
else r = mid - 1; //区别
}
return l;
}
2.2 浮点数二分
double bin_search(double l, double r) {
while (r - l > 1e-8)