LeetCode 1011.在D天内传送包裹的能力
根据官方题解的理解:先计算出最低载重量的范围,依题意得,船的载货量最少为货物重量的最大值,最多为所有货物重量之和。我们在这个范围内利用二分查找算出最低载重量,使得刚好在D天内运完所有货物。
二分查找:
1.在当前载货量下需要多少天运完
int need = 1, cur = 0; //need为所需天数,mid为当前载重量
for(int weight : weights) {
if(cur + weight > mid) {
need++;
cur = 0;
}
cur += weight;
}
2.比较实际所需天数和计划所需天数,如果need<=D说明载重量还可以更低,将载重量范围缩小到left~mid之间,即right=mid。如果need>D说明载重量要增大,将载重量范围缩小到mid+1 ~right之间,即left=mid+1。
3.当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) / 2;
int need = 1, cur = 0;
for(int weight : weights) {
if(cur + weight > mid) {
need++;
cur = 0;
}
cur += weight;
}
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)。