Easy
题目描述
给你一个正整数 n,表示船上一个 n x n 的货物甲板。甲板上的每个格子可以放置一个重量恰好为 w 的集装箱。
但是,如果把所有集装箱都装载到甲板上,所有集装箱的总重量不能超过船的最大载重量 maxWeight。
返回可以装载到船上的集装箱的最大数量。
示例 1:
输入:n = 2, w = 3, maxWeight = 15
输出:4
解释:甲板有 4 个格子,每个集装箱重量为 3。装载所有集装箱的总重量为 12,不超过 maxWeight。
示例 2:
输入:n = 3, w = 5, maxWeight = 20
输出:4
解释:甲板有 9 个格子,每个集装箱重量为 5。在不超过 maxWeight 的情况下,最多可以装载 4 个集装箱。
约束条件:
1 <= n <= 10001 <= w <= 10001 <= maxWeight <= 10^9
提示:
- 集装箱数量的限制是什么?
- 我们最多可以装载
min(n * n, maxWeight / w)个集装箱。
解题思路
这道题本质上是一个简单的数学问题。我们需要找到在两个约束条件下的最小值:
- 空间约束:甲板是
n x n的,最多只能放置n * n个集装箱 - 重量约束:每个集装箱重量为
w,总重量不能超过maxWeight,所以最多能放置maxWeight / w个集装箱(整数除法)
解题思路很直观:
- 甲板总共有
n * n个位置 - 根据重量限制,最多能放
maxWeight / w个集装箱 - 实际能放置的集装箱数量就是这两个值的最小值
这个问题的核心在于理解约束条件。空间限制了物理位置的数量,而重量限制了总载重。我们必须同时满足这两个条件,因此取较小值。
时间复杂度为 O(1),因为只需要进行简单的算术运算。空间复杂度也是 O(1),不需要额外的存储空间。
代码实现
class Solution {
public:
int maxContainers(int n, int w, int maxWeight) {
return min(n * n, maxWeight / w);
}
};
class Solution:
def maxContainers(self, n: int, w: int, maxWeight: int) -> int:
return min(n * n, maxWeight // w)
public class Solution {
public int MaxContainers(int n, int w, int maxWeight) {
return Math.Min(n * n, maxWeight / w);
}
}
var maxContainers = function(n, w, maxWeight) {
return Math.min(n * n, Math.floor(maxWeight / w));
};
复杂度分析
| 复杂度类型 | 复杂度 |
|---|---|
| 时间复杂度 | O(1) |
| 空间复杂度 | O(1) |