二分法模板
二分法有两套模板,根据check(mid) 时调整的是left还是right,来确定求mid时要不要加1。如果是调整left,需要加1,防止死循环,因为整数除法向下取整。具体实现如下:
模板一
while (left < right) {
int mid = left + (right - left) / 2;
if (check(mid) == true) right = mid;
else left = mid + 1;
}
模板二
while (left < right) {
int mid = left + (right - left) / 2 + 1;
if (check(mid) == true) left = mid;
else right = mid - 1;
}
另一个角度看待二分法:区间是否为0
力扣704.二分查找
区间为0跳出循环,即left < right:
class Solution {
public int search(int[] nums, int target) {
int right = nums.length; // [0, n)
int left = 0;
while (left < right) {
int mid = left + ((right - left) >> 1);
if (nums[mid] < target) left = mid + 1;
else if (nums[mid] > target) right = mid;
else return mid;
}
return -1;
}
}
区间为0不跳出循环,即left <= right
class Solution {
public int search(int[] nums, int target) {
int n = nums.length;
int left = 0, right = n - 1;
while (left <= right) {
int mid = left + ((right - left) >> 1);
if (nums[mid] < target) left = mid + 1;
else if (nums[mid] > target) right = mid - 1;
else return mid;
}
return -1;
}
}