3492. Maximum Containers on a Ship
Problem Description
You have a ship with an n x n
cargo deck, where each cell can hold exactly one container. Each container weighs exactly w
units.
The ship has a maximum weight capacity of maxWeight
units that it can safely carry.
You need to determine the maximum number of containers you can load onto the ship without exceeding the weight limit.
The solution approach recognizes that:
- The deck has
n × n
total cells available - Each container weighs
w
units - The total weight cannot exceed
maxWeight
Therefore, the maximum number of containers is limited by either:
- The physical space on the deck:
n × n
containers - The weight constraint:
maxWeight ÷ w
containers (rounded down)
The answer is the smaller of these two values, which can be calculated as min(n × n × w, maxWeight) ÷ w
.
Intuition
The key insight is recognizing that we have two constraints limiting how many containers we can load:
-
Physical space constraint: The deck has
n × n
cells, so we can't load more thann × n
containers regardless of weight. -
Weight constraint: The ship can carry at most
maxWeight
units of weight. Since each container weighsw
units, we can load at mostmaxWeight ÷ w
containers (rounded down).
We need to satisfy both constraints simultaneously, so we take the minimum of these two limits.
To find this minimum elegantly, we can think of it as:
- The maximum possible weight if we fill the entire deck is
n × n × w
- But we can't exceed
maxWeight
, so the actual weight we can load ismin(n × n × w, maxWeight)
- To get the number of containers from this weight, we divide by
w
This gives us the formula: min(n × n × w, maxWeight) ÷ w
This approach works because dividing the minimum allowable weight by the weight per container gives us exactly the maximum number of containers we can load while respecting both the space and weight limitations.
Learn more about Math patterns.
Solution Approach
The implementation is straightforward and uses pure mathematics without any complex data structures or algorithms.
The solution calculates the maximum number of containers in a single expression:
return min(n * n * w, maxWeight) // w
Breaking down the implementation:
-
Calculate total possible weight:
n * n * w
computes the weight if we were to fill every cell on then × n
deck with a container of weightw
. -
Apply weight constraint:
min(n * n * w, maxWeight)
ensures we don't exceed the ship's maximum weight capacity. This gives us the actual weight we can load. -
Convert weight to container count: We use integer division
// w
to convert the total weight back to the number of containers. Since each container weighs exactlyw
units, dividing the total weight byw
gives us the container count.
The beauty of this solution is its efficiency - it runs in O(1)
time complexity and uses O(1)
space complexity, as it performs just a few arithmetic operations regardless of the input size.
No loops, recursion, or additional data structures are needed. The mathematical formula directly computes the answer by considering both the physical and weight constraints simultaneously.
Ready to land your dream job?
Unlock your dream job with a 5-minute evaluator for a personalized learning plan!
Start EvaluatorExample Walkthrough
Let's walk through an example with n = 3
, w = 10
, and maxWeight = 50
.
Step 1: Identify the constraints
- The deck has
3 × 3 = 9
cells total - Each container weighs
10
units - The ship can carry at most
50
units of weight
Step 2: Calculate the maximum based on physical space
- If we fill all cells:
9
containers - Total weight would be:
9 × 10 = 90
units
Step 3: Calculate the maximum based on weight limit
- With
maxWeight = 50
andw = 10
- Maximum containers by weight:
50 ÷ 10 = 5
containers
Step 4: Apply the formula
Using min(n × n × w, maxWeight) ÷ w
:
n × n × w = 3 × 3 × 10 = 90
min(90, 50) = 50
50 ÷ 10 = 5
Result: 5 containers
The weight constraint is the limiting factor here. Even though the deck has space for 9 containers, we can only load 5 containers (weighing 50 units total) without exceeding the ship's weight capacity.
Let's verify with another example where space is the limiting factor:
n = 2
,w = 5
,maxWeight = 100
- Space allows:
2 × 2 = 4
containers - Weight allows:
100 ÷ 5 = 20
containers - Using the formula:
min(2 × 2 × 5, 100) ÷ 5 = min(20, 100) ÷ 5 = 20 ÷ 5 = 4
- Result: 4 containers (limited by deck space)
Solution Implementation
1class Solution:
2 def maxContainers(self, n: int, w: int, maxWeight: int) -> int:
3 """
4 Calculate the maximum number of containers that can be loaded.
5
6 Args:
7 n: Number of containers available
8 w: Weight of each container
9 maxWeight: Maximum total weight capacity
10
11 Returns:
12 Maximum number of containers that can be loaded without exceeding weight limit
13 """
14 # Calculate the total weight if all n containers are loaded
15 # Since we can load at most n containers, the maximum possible weight is n * n * w
16 # (This appears to account for some quadratic relationship in the problem)
17 total_possible_weight = n * n * w
18
19 # Take the minimum between the total possible weight and the maximum weight capacity
20 # to ensure we don't exceed the weight limit
21 actual_weight = min(total_possible_weight, maxWeight)
22
23 # Calculate how many containers can fit within the actual weight limit
24 # by dividing the actual weight by the weight of each container
25 max_containers = actual_weight // w
26
27 return max_containers
28
1class Solution {
2 /**
3 * Calculates the maximum number of containers that can be transported
4 * given the constraints on number, weight, and maximum capacity.
5 *
6 * @param n The maximum number of containers per trip/batch
7 * @param w The weight of each individual container
8 * @param maxWeight The maximum total weight capacity
9 * @return The maximum number of containers that can be transported
10 */
11 public int maxContainers(int n, int w, int maxWeight) {
12 // Calculate the total weight if we take n containers n times
13 int totalPossibleWeight = n * n * w;
14
15 // The actual weight we can carry is limited by the maximum weight capacity
16 int actualWeight = Math.min(totalPossibleWeight, maxWeight);
17
18 // Calculate the number of containers by dividing the weight by individual container weight
19 int maxNumberOfContainers = actualWeight / w;
20
21 return maxNumberOfContainers;
22 }
23}
24
1class Solution {
2public:
3 /**
4 * Calculate the maximum number of containers that can be loaded
5 * @param n - Dimension of the container grid (n x n arrangement)
6 * @param w - Weight of each individual container
7 * @param maxWeight - Maximum total weight capacity
8 * @return Maximum number of containers that can be loaded without exceeding weight limit
9 */
10 int maxContainers(int n, int w, int maxWeight) {
11 // Calculate total weight if all n*n containers are loaded
12 int totalPossibleWeight = n * n * w;
13
14 // The actual weight we can load is limited by the maximum weight capacity
15 int actualLoadWeight = min(totalPossibleWeight, maxWeight);
16
17 // Calculate how many containers fit within the weight limit
18 int maxContainerCount = actualLoadWeight / w;
19
20 return maxContainerCount;
21 }
22};
23
1/**
2 * Calculates the maximum number of containers that can be transported
3 * @param n - The dimension parameter (likely representing container arrangement)
4 * @param w - The weight of each container
5 * @param maxWeight - The maximum total weight capacity
6 * @returns The maximum number of containers that can be transported
7 */
8function maxContainers(n: number, w: number, maxWeight: number): number {
9 // Calculate the total weight if all n*n containers are used
10 const totalWeightOfAllContainers: number = n * n * w;
11
12 // Find the minimum between total weight of all containers and max weight capacity
13 const actualWeightToUse: number = Math.min(totalWeightOfAllContainers, maxWeight);
14
15 // Divide by container weight to get number of containers (using bitwise OR for integer division)
16 const maxNumberOfContainers: number = (actualWeightToUse / w) | 0;
17
18 return maxNumberOfContainers;
19}
20
Time and Space Complexity
The time complexity is O(1)
because the function performs a fixed number of arithmetic operations regardless of the input size. It calculates n * n * w
, compares it with maxWeight
using the min()
function, and then performs integer division by w
. All these operations take constant time.
The space complexity is O(1)
because the function only uses a constant amount of extra space. No additional data structures are created, and the space used does not depend on the input values n
, w
, or maxWeight
.
Learn more about how to find time and space complexity quickly.
Common Pitfalls
1. Integer Overflow in Large Input Cases
The most significant pitfall in this solution is the potential for integer overflow when calculating n * n * w
. If n
and w
are large values, their product could exceed the maximum integer limit in some programming languages.
Example scenario:
- If
n = 10^5
andw = 10^5
, thenn * n * w = 10^15
, which could cause overflow in languages with 32-bit integers.
Solution: Instead of calculating the full product first, rearrange the logic to avoid large intermediate values:
def maxContainers(self, n: int, w: int, maxWeight: int) -> int:
# Check if weight constraint is the limiting factor first
max_by_weight = maxWeight // w
max_by_space = n * n
# Return the minimum of the two constraints
return min(max_by_weight, max_by_space)
2. Division by Zero
If w = 0
, the code will throw a division by zero error. While this might be outside the problem constraints, defensive programming suggests handling this edge case.
Solution: Add a guard clause at the beginning:
def maxContainers(self, n: int, w: int, maxWeight: int) -> int:
if w == 0:
return 0 # No containers can be loaded if they weigh nothing
return min(n * n * w, maxWeight) // w
3. Confusion About Problem Interpretation
The code comment mentions "n containers available" but the actual calculation uses n * n
, suggesting an n × n
grid. This inconsistency could lead to misunderstanding and incorrect modifications.
Solution: Ensure comments accurately reflect the problem:
def maxContainers(self, n: int, w: int, maxWeight: int) -> int:
"""
Calculate the maximum number of containers that can be loaded on an n×n deck.
Args:
n: Dimension of the square deck (n×n grid)
w: Weight of each container
maxWeight: Maximum total weight capacity
"""
# The deck has n×n cells, each can hold one container
return min(n * n * w, maxWeight) // w
Which of these pictures shows the visit order of a depth-first search?
Recommended Readings
Math for Technical Interviews How much math do I need to know for technical interviews The short answer is about high school level math Computer science is often associated with math and some universities even place their computer science department under the math faculty However the reality is that you
Coding Interview Patterns Your Personal Dijkstra's Algorithm to Landing Your Dream Job The goal of AlgoMonster is to help you get a job in the shortest amount of time possible in a data driven way We compiled datasets of tech interview problems and broke them down by patterns This way
Recursion Recursion is one of the most important concepts in computer science Simply speaking recursion is the process of a function calling itself Using a real life analogy imagine a scenario where you invite your friends to lunch https assets algo monster recursion jpg You first call Ben and ask
Want a Structured Path to Master System Design Too? Don’t Miss This!