题目
https://leetcode-cn.com/problems/capacity-to-ship-packages-within-d-days/
代码
二分查找,初始left为最重的包裹(因为一个包裹不能被拆分),right为所有包裹重量之和。
class Solution {
public int shipWithinDays(int[] weights, int D) {
int left=Arrays.stream(weights).max().getAsInt();
int right=Arrays.stream(weights).sum();
while(left<right){
int mid=left+(right-left)/2;//每日运载能力
int need=1;
int cur=0;
for(int w:weights){
if(cur+w>mid){
need++;
cur=0;
}
cur+=w;
}
if(need<=D){
right=mid;
}
else{
left=mid+1;
}
}
return left;
}
}
复杂度
时间复杂度:O(nlog(Σw)),其中 n 是数组weights 的长度,Σw 是数组 weights 中元素的和。二分查找需要执行的次数为O(log(Σw)),每一步中需要对数组weights 进行依次遍历,时间为 O(n),相乘即可得到总时间复杂度。
空间复杂度:O(1)。