二分搜索题
首先找到自变量x----船的运载能力
然后是y-----------传运载完需要的天数
便可以得到以下xy坐标图,xy之间的关系由f()方法表示
左边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;
}
}