A conveyor belt has packages that must be shipped from one port to another within days
days.
The ith
package on the conveyor belt has a weight of weights[i]
. Each day, we load the ship with packages on the conveyor belt (in the order given by weights
). We may not load more weight than the maximum weight capacity of the ship.
Return the least weight capacity of the ship that will result in all the packages on the conveyor belt being shipped within days
days.
Example 1:
Input: weights = [1,2,3,4,5,6,7,8,9,10], days = 5 Output: 15 Explanation: A ship capacity of 15 is the minimum to ship all the packages in 5 days like this: 1st day: 1, 2, 3, 4, 5 2nd day: 6, 7 3rd day: 8 4th day: 9 5th day: 10 Note that the cargo must be shipped in the order given, so using a ship of capacity 14 and splitting the packages into parts like (2, 3, 4, 5), (1, 6, 7), (8), (9), (10) is not allowed.
Example 2:
Input: weights = [3,2,2,4,1,4], days = 3 Output: 6 Explanation: A ship capacity of 6 is the minimum to ship all the packages in 3 days like this: 1st day: 3, 2 2nd day: 2, 4 3rd day: 1, 4
Example 3:
Input: weights = [1,2,3,1,1], days = 4 Output: 3 Explanation: 1st day: 1 2nd day: 2 3rd day: 3 4th day: 1, 1
Constraints:
1 <= days <= weights.length <= 5 * 104
1 <= weights[i] <= 500
This problem asks for the minimum weight capacity of a ship to transport all packages within a given number of days. The key insight is that this problem can be solved efficiently using binary search.
Core Idea:
We can determine if a given ship capacity is sufficient to deliver all packages within the allowed days. If a capacity is insufficient, we need a larger capacity; if it's sufficient, we can try a smaller one. This allows us to use binary search to find the optimal capacity.
Algorithm:
Find the search space: The minimum capacity is the weight of the heaviest package. The maximum capacity is the sum of all package weights (in the worst-case scenario, each package is shipped on a separate day).
Binary Search: We perform binary search within the range [minimum capacity, maximum capacity].
check(capacity)
function: This crucial helper function simulates the shipping process with a given capacity
. It iterates through the packages, accumulating their weights. If the accumulated weight exceeds capacity
, it increments the number of days needed and resets the accumulated weight. Finally, it returns true
if the total number of days needed is less than or equal to the allowed days (days
), and false
otherwise.
Iterative refinement: The binary search iteratively narrows the search space. If check(mid)
is true (the capacity is sufficient), we update the right
boundary to mid
; otherwise (capacity is insufficient), we update the left
boundary to mid + 1
.
Result: The loop continues until left
and right
converge, at which point left
(or right
) represents the minimum required capacity.
Time Complexity Analysis:
sum(weights)
is the total weight of all packages and max(weights)
is the heaviest package weight. The search space is logarithmic in size.check
function: The check
function iterates through the weights
array once, taking O(n) time, where n
is the number of packages.Therefore, the overall time complexity is dominated by the binary search and is O(n log(sum(weights) - max(weights))).
Space Complexity Analysis:
The space complexity is O(1) because the algorithm uses a constant amount of extra space regardless of the input size. We only use a few variables to store the boundaries, mid-point and the current weight sum.
Code Explanation (Python):
The Python code utilizes the bisect_left
function from the bisect
module for an efficient binary search implementation. It directly searches for the smallest index in the range range(left, right)
where check(x)
returns True
.
Code Explanation (Other Languages):
The Java, C++, Go, and TypeScript codes implement a standard iterative binary search. The check
function remains consistent across all languages, performing the package-shipping simulation. The primary differences lie in syntax and specific library functions (e.g., Math.max
vs std::max
).