LeetCode 1011.在D天内传送包裹的能力

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)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值