最近又开始刷题了,定期总结一下,主要还是跟着labuladong进行二分法的刷题
1.如何判别是不是可以用二分法?
1)有序数组中搜索给定某个目标值的索引。
2)搜索空间有序时,可以通过二分搜索剪枝
2.二分搜索的框架
int binarySearch(int[] nums, int target) {
int left = 0, right = ...;
while(...) {
int mid = left + (right - left) / 2;
if (nums[mid] == target) {
...
} else if (nums[mid] < target) {
left = ...
} else if (nums[mid] > target) {
right = ...
}
}
return ...;
}
3.二分搜索需要注意的细节
1)不要写else,尽量写else if,写出条件会比较清楚
2)计算 mid 时需要防止溢出,代码中 left + (right - left) / 2
就和 (left + right) / 2
的结果相同,但是有效防止了 left
和 right
太大直接相加导致溢出。
3)while条件里面写小于等于还是小于,注意判断,不要溢出。和right的大小等于length或者length-1有关。
4)left,right是怎么变化的,如何更新的,一般是left = mid, right=mid+1
3.二分搜索的题目
1)珂珂吃香蕉
把问题拆解,找到最大吃香蕉速度(max(arr)),最小吃香蕉速度=1,然后判断max和min是不是可行的,然后在计算mid逐步更新,最后返回min_speed即可。判断能否吃完,需要单独写一个函数。
2)运输问题
和上一道题类似,有一个最大运载能力,一个最低运载能力,然后通过二分法来找最低的。判断能否运载完需要单独写一个函数。