每日一刷——1205——二分搜索——在D天内送达包裹的能力

题目描述:

题目链接哈:
1011. 在 D 天内送达包裹的能力 - 力扣(LeetCode)

题目分析:

按照上一个题目的思路再来思考一下这个题目:

1.target:约束条件,那么这里就是days

2.x:船的运载能力

3.f(x) :运完的天数----->所以这里需要和weights进行比较,然后返回具体运完的时间,和上一题思路差不多我觉得

看不懂的可以先去看看我上一个爱吃香蕉的珂珂那个题解

错误题解:

惹,错了哈...

class Solution {
    public static int f(int[] weights ,int x){
        int sum=0;
        int days=0;
        for(int i=0;i<weights.length;i++){
            sum+=weights[i];
            if(sum>x){
                sum=0;
                sum+=weights[i];
                days++;
            }
        }
        return days;
    }

    public int shipWithinDays(int[] weights, int days) {
        int left=1;
        int right =501;
        while(left<right){
            int mid=left+(right-left)/2;
            if(f(weights,mid)==days){
                right=mid;
            }else if(f(weights,mid)<days){
                right=mid;
            }else if(f(weights,mid)>days){
                left=mid+1;
            }
        }
        return left;
    }
}

分析错误原因:

错误一:

 最大载重和最小载重搞错了哈,我把上一题的思路原封不动搬过来了,可恶

!!!最小载重是weights元素中的最大值!!每次至少要运一个货物才行!!别搞错了

错误二:

测试了一下,发现肯定是最上面那个f函数写错了,大家可以发现days搞错了,最开始的一天没计算进来,所以搞错了,我每次都这样,真服了

所以把days初始值改为1就对了,因为至少要搬运一次,所以一次搬完的话,if条件进不去days不会++,所以原来就导致搬了一次但days=0,所以把days初始值改为1,就对了

正确题解:

class Solution {
    public static int f(int[] weights ,int x){
        int sum=0;
        int days=1;
        for(int i=0;i<weights.length;i++){
            sum+=weights[i];
            if(sum>x){
                sum=0;
                sum+=weights[i];
                days++;
            }
        }
        return days;
    }

    public int shipWithinDays(int[] weights, int days) {
        int left=0;
        int right =1;   //要额外加一
        for(int a:weights){
            left=Math.max(a,left);
            right+=a;
        }
        while(left<right){
            int mid=left+(right-left)/2;
            if(f(weights,mid)==days){
                right=mid;
            }else if(f(weights,mid)<days){
                right=mid;
            }else if(f(weights,mid)>days){
                left=mid+1;
            }
        }
        return left;
    }
}

 看来还是要注意细节啊,哎,感觉自己思考的不够全面和仔细和深入,导致每次都有一点小问题出来

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值