1. 介绍
二分查找:
数组 nums 升序,查找最小的满足 nums[i] >= target 的下标 i,如果所有数都 小于 target,返回数组的长度。 要求 对数时间 复杂度。
二分答案:
- 答案具有单调性
- 确定二分范围
- 二分答案
2. 代码模版
public static int minimizeArrayValue(int[] nums) {
// 确定二分范围
int left = 0;
int right = 0;
for(int val : nums){
right = Math.max(right, val);
}
// 二分查找(闭区间)
while(left <= right) {
int mid = (left + right) / 2;
//System.out.printf("left: %d, right: %d, mid: %d\n", left, right, mid);
if(check(nums, mid)) {
right = mid - 1;
}else{
left = mid + 1;
}
}
// 循环不变量 left - 1、right + 1
// 结束循环时,left > right,即 right + 1 = left
return right+1;
}//end method
private static boolean check(int[] nums, int limit) {
long extra = 0;
for (int i = nums.length - 1; i > 0; i--) {
if(nums[i] + extra > limit){
extra = nums[i] + extra - limit;
}else{
extra = 0;
}
}
return (nums[0] + extra) <= limit;
}//end method