1011. 在 D 天内送达包裹的能力(Java、二分搜索)

二分搜索题
首先找到自变量x----船的运载能力
然后是y-----------传运载完需要的天数
便可以得到以下xy坐标图,xy之间的关系由f()方法表示
IMG_20220404_111156.jpg
左边left最低是每天运一件货物,所以取货物中最重的为左指针,day对应就是n件货物运n天
右边right最多,一天全部运完,取货物重量总和,day对应则是1天
本题要求返回能在 days 天内将传送带上的所有包裹送达的船的最低运载能力。
也就是去day天横线的最左边
因此使用二分搜索框架中查找最左边的框架即可

另外一个注意点是f()方法的编写
差点没整出来=V=

class Solution {
    public int shipWithinDays(int[] weights, int days) {
        int left = 1,right = 1;
        for(int w:weights){
            left = Math.max(left,w);
            right += w;
        }
        while(left<right){
            int mid = left+(right-left)/2;
            if(f(weights,mid)>days){
                left = mid+1;
            }else if(f(weights,mid)<days){
                right = mid;
            }else if(f(weights,mid)==days){
                right = mid;
            }
        }
        return right;
    }

    int f(int[] weights,int x){
        int days = 0;
        for(int i = 0;i<weights.length;){
            int cap = x;
            while(i<weights.length){
                if(cap-weights[i]>=0){
                    cap -= weights[i];
                }else if(cap-weights[i]<0){
                    break;
                }
                i++;
            }
            days++;
        }
        return days;
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值