1011. 在 D 天内送达包裹的能力
二分查找
class Solution {
public int shipWithinDays(int[] weights, int days) {
/**
* 最小运输量为所有货物中最重的那个,否则大于它的货物永远不能运载
*/
int minLoad = Arrays.stream(weights).max().getAsInt();
int maxLoad = Arrays.stream(weights).sum();
while (minLoad < maxLoad) {
int load = minLoad + (maxLoad- minLoad) / 2;
if (time(load, weights) > days) {
minLoad = load + 1;
}
else {
maxLoad = load;
}
}
return minLoad;
}
public int time(int load, int[] weights){
int day = 0;
int sum = 0;
for (int i = 0; i < weights.length; i++) {
/**
* 如果货物累计重量小于等于运载量,就累计,再计算下一个货物
*/
if (sum + weights[i] <= load){
sum += weights[i];
/**
* 如果最后剩余的sum不为空,还需要额外加一天
*/
if (i == weights.length - 1){
day++;
}
}
else {
/**
* 否则当前货物不动,清空累计,再加一天
*/
sum = 0;
day++;
i--;
}
}
return day;
}
}
/**
* 时间复杂度 O(nlogn)
* 空间复杂度 O(1)
*/
https://leetcode-cn.com/problems/capacity-to-ship-packages-within-d-days/