题目描述:
题目链接哈:
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;
}
}
看来还是要注意细节啊,哎,感觉自己思考的不够全面和仔细和深入,导致每次都有一点小问题出来