1. 介紹
二分查找:
數(shù)組 nums 升序,查找最小的滿足 nums[i] >= target 的下標(biāo) i,如果所有數(shù)都 小于 target,返回?cái)?shù)組的長度。 要求 對數(shù)時間 復(fù)雜度。
二分答案:
- 答案具有單調(diào)性
- 確定二分范圍
- 二分答案
2. 代碼模版
public static int minimizeArrayValue(int[] nums) {
// 確定二分范圍
int left = 0;
int right = 0;
for(int val : nums){
right = Math.max(right, val);
}
// 二分查找(閉區(qū)間)
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;
}
}
// 循環(huán)不變量 left - 1、right + 1
// 結(jié)束循環(huán)時,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