Leetcode--1011在D天内送达包裹的能力

在这里插入图片描述

解题思路

因为求的是满足条件的最小的运载量,所以所以针对某一运载量w,不应该存在一个小于w的数满足条件。且要能运输所有的货物,运载量的最低值应为货物单体的最大值(不可拆分货物),最大值为所有货物的总和。
设置l和r分别等于单个货物的最大值和货物重量总和,使用二分方法,每次对l和r的均值进行检测,如果w=mid时满足条件,则r=mid,否则l=mid+1;最后返回r的值。

代码

class Solution {
    public int shipWithinDays(int[] weights, int D) {
        int sum = 0;
        int max = 0;
        for(int i:weights)
        {
            max = Math.max(max, i);//获取单体最大值
            sum += i;//获取总和
        }
        int l=max, r=sum;
        while(l<r)
        {
            int mid = l+r >> 1;//每次使用均值进行检测
            if(check(weights,mid,D))
            {
                r = mid;
            }
            else{
                l=mid+1;
            }
        }
        return r;//返回l和r都一样,因为while循环的出口是l=r
    }

    public boolean check(int [] weights , int w, int D)//检测每次运送w,需要运多少天
    {
        int c=0;
        
        int i=1;
        int cur_sum = weights[0];
        while(i<weights.length)
        {
            while(i<weights.length && cur_sum + weights[i] <= w)
            {
                cur_sum += weights[i];
                i++;
            }
            
                cur_sum=0;
                c++;
            
        }
        return c<=D;//如果每次的运载量为w的话,需要的天数大于D,则证明不满足条件,则l=mid+1
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值