题解
本题的核心问题是找到一个船的最低运载能力,使得所有的包裹能够在指定的天数内完成运输。为了解决这个问题,我们可以使用二分查找算法,结合一个辅助函数来判断在给定运载能力下是否能在指定天数内完成运输。
辅助函数 can_ship_in_days
这个函数接受包裹的重量列表、船的运载能力和指定的天数作为输入,并返回一个布尔值,表示是否可以在指定天数内完成所有包裹的运输。
-
初始化当前重量为0,所需天数为1。
-
遍历每个包裹的重量:
- 如果当前重量加上当前包裹的重量超过了运载能力,则意味着需要新的一天来运送,因此增加所需天数,并将当前重量重置为0。
- 如果在任何时候所需天数超过了指定的天数,则返回False。
-
如果成功遍历了所有包裹,则返回True。
主函数 solution
这个函数接受包裹的重量列表和指定的天数作为输入,并返回船的最低运载能力。
-
初始化左边界为包裹中最重的那个包裹的重量(因为运载能力至少要能承载最重的包裹)。
-
初始化右边界为所有包裹重量的总和(因为运载能力最大不会超过所有包裹的总重量)。
-
使用二分查找算法在左边界和右边界之间查找最低的运载能力:
- 计算中间值。
- 使用辅助函数
can_ship_in_days来判断在给定中间值的运载能力下是否能在指定天数内完成运输。 - 如果可以,则尝试降低运载能力(将右边界设置为中间值)。
- 如果不可以,则增加运载能力(将左边界设置为中间值加1)。
-
当左边界和右边界相等时,二分查找结束,返回左边界作为最低运载能力。
测试
最后,通过几个测试用例来验证解决方案的正确性:
weights=[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1], days=5:在这个例子中,最低运载能力是15,因为如果使用14作为运载能力,无法在5天内完成所有包裹的运输。weights=[3, 2, 2, 5, 1, 4], days=2:在这个例子中,最低运载能力是10,因为如果使用9作为运载能力,无法在2天内完成所有包裹的运输。weights=[1, 2, 3, 8, 4], days=4:在这个例子中,最低运载能力是8,因为8正好是某个包裹的重量,且在这个运载能力下可以在4天内完成所有包裹的运输。
通过二分查找算法,我们能够高效地找到满足条件的最低运载能力,时间复杂度为O(n log m),其中n是包裹的数量,m是所有包裹重量的总和。