2.二分算法
-
左边界
int bsearch_left(int l, int r) { //第二步:递归处理子问题,用while循环来实现 while (l < r) { //第一步:分解成子问题,这是二分的核心--范围减半 int mid = l + r >> 1; if (check(mid)) r = mid; //向左边找 //if判断mid是否满足性质,注意该性质会划分数组的右边部分 else l = mid + 1; //向右边找 } //第三步:合并子问题.对二分算法来说,不需要这一步 return l; //l就是寻找的左分界点,如果数组中没有要找的点,l的值就是r,但这是一个错误答案 }
-
右边界
int bsearch_right(int l, int r) { while (l < r) { int mid = l + r + 1 >> 1; // mid 向上取整 if (check(mid)) l = mid; else r = mid - 1; } return l; }