参考链接
- https://leetcode-cn.com/problems/capacity-to-ship-packages-within-d-days/
题目描述
传送带上的包裹必须在 D 天内从一个港口运送到另一个港口。
传送带上的第 i 个包裹的重量为 weights[i]。每一天,我们都会按给出重量的顺序往传送带上装载包裹。我们装载的重量不会超过船的最大运载重量。
返回能在 D 天内将传送带上的所有包裹送达的船的最低运载能力。
解题思路
船的运载能力有一个范围,最小值是所有包裹中的最大重量,最大值是所有包裹的重量和。于是问题可以转化为一个搜索问题,查找给定范围内,满足条件的最小值,可以用二分查找求解。
代码
class Solution {
public:
int shipWithinDays(vector<int>& weights, int D) {
int left = 0;
int right = 0;
for (int num : weights)
{
right += num;
left = max(left, num);
}
while (left < right)
{
int mid = (left + right) / 2;
int cur = 0;
int need = 1;
for (int i = 0; i < weights.size(); i ++)
{
if (cur + weights[i] > mid)
{
need ++;
cur = 0;
}
cur += weights[i];
}
if (need <= D)
{
right = mid;
}
else
{
left = mid + 1;
}
}
return left;
}
};