记两个二分的板子,直接记住结论,下次减少思考时间:
while(<=) /2 ±1
找满足check范围的左端点:
int bsearch_1(int left, int right){
while (left <= right) {
int mid = (left + right)/ 2;
if (check(mid)) right = mid - 1;
else left = mid + 1;
}
return left;
}
找满足check范围的右端点:
int bsearch_2(int left, int right){
while (left <= right) {
int mid = (left + right)/ 2;
if (check(mid)) left = mid + 1;
else right = mid - 1;
}
return right;
}
可以看出最后出循环时的状态为
r
<
l
r < l
r<l,记住这点即可容易地判断出边界条件关系和答案。