leetcode第1011天 在D天内送达包裹的能力
二分框架的实际应用:
二分框架的最值还是用的多.
class Solution {
public int shipWithinDays(int[] weights, int days) {
//注意这里是right 是开区间,必须额外加1
int left = 0;
int right = 1;
for (int i : weights) {
left = Math.max(left,i);
//这里无非就是一口气把货物直接就装完了
right += i;
}
while(left < right){
int mid = left + (right - left) / 2;
if (f(weights,mid) == days){
right = mid;
}else if (f(weights,mid) < days){
right = mid;
}else if (f(weights,mid) > days){
left = mid + 1;
}
}
return left;
}
/**
* 定义:当运载能力为x时,需要f(x)天运完货物
* 这个函数在定义的时候就是有一些难度的
* @param weights
* @param x
* @return
*/
public int f(int[] weights,int x){
int day = 0;
for (int i = 0; i < weights.length; ) {
//这是装卸货物的最大容量
int cap = x;
while(i < weights.length){
if (cap < weights[i]){
break;
}else {
cap -= weights[i];
i++;
}
}
day++;
}
return day;
}
}