传送带上的包裹必须在 D 天内从一个港口运送到另一个港口。
传送带上的第 i 个包裹的重量为 weights[i]。每一天,我们都会按给出重量的顺序往传送带上装载包裹。我们装载的重量不会超过船的最大运载重量。
返回能在 D 天内将传送带上的所有包裹送达的船的最低运载能力。
示例 1:
输入:weights = [1,2,3,4,5,6,7,8,9,10], D = 5
输出:15
解释:
船舶最低载重 15 就能够在 5 天内送达所有包裹,如下所示:
第 1 天:1, 2, 3, 4, 5
第 2 天:6, 7
第 3 天:8
第 4 天:9
第 5 天:10
请注意,货物必须按照给定的顺序装运,因此使用载重能力为 14 的船舶并将包装分成 (2, 3, 4, 5), (1, 6, 7), (8), (9), (10) 是不允许的。
示例 2:
输入:weights = [3,2,2,4,1,4], D = 3
输出:6
解释:
船舶最低载重 6 就能够在 3 天内送达所有包裹,如下所示:
第 1 天:3, 2
第 2 天:2, 4
第 3 天:1, 4
示例 3:
输入:weights = [1,2,3,1,1], D = 4
输出:3
解释:
第 1 天:1
第 2 天:2
第 3 天:3
第 4 天:1, 1
提示:
解题思路:
本题要求我们找出船的最低运载能力,而这个运载能力要求我们在D天内将所有货物都送完,因此我们可以二分查找这个运载能力
首先,运载能力应该处于1
到sum of the nums
之间,因为可能只有一件货物
现在,我们就在这个区间中二分查找,我们先写一个函数来判断一个运载能力为power的船运完货物需要多少天
public int NeededDays(int[] weights,int power, int D)
{
int days=0; //天数
int weight=0; //货物的重量
int i=0;
while(ipower) //如果超过运载能力
{
days++; //天数加1
weight=0; //将货物卸下
}
else //装下一件货物
i++;
if(days>D) //如果天数超过规定的时间,之间返回
return days;
}
return days+1; //返回天数
}
缩小区间的条件为
完整代码如下:
class Solution
{
public int shipWithinDays(int[] weights, int D) {
int left = 0;
int right = 0;
for(int i=0; i>1;
int days = NeededDays(weights,mid,D);
if(days>D)
left = mid+1;
else
right = mid;
}
return right;
}
public int NeededDays(int[] weights,int power, int D)
{
int days=0;
int weight=0;
int i=0;
while(ipower)
{
days++;
weight=0;
}
else
i++;
if(days>D)
return days;
}
return days+1;
}
}
时间复杂度为O(log2(sum of nums)*N),二分查找了区间加上遍历一遍数组
空间复杂度为O(1)