Easy
题目描述
给你一个整数数组 capacity,其中 capacity[i] 表示第 i 个盒子的容量,以及一个表示物品大小的整数 itemSize。
如果 capacity[i] >= itemSize,那么第 i 个盒子可以存储该物品。
返回一个整数,表示能够存储该物品的最小容量盒子的索引。如果存在多个这样的盒子,返回最小的索引。
如果没有盒子能够存储该物品,返回 -1。
示例 1:
输入:capacity = [1,5,3,7], itemSize = 3
输出:2
解释:索引 2 处的盒子容量为 3,这是能够存储该物品的最小容量。因此答案是 2。
示例 2:
输入:capacity = [3,5,4,3], itemSize = 2
输出:0
解释:能够存储该物品的最小容量是 3,它出现在索引 0 和 3。因此答案是 0。
示例 3:
输入:capacity = [4], itemSize = 5
输出:-1
解释:没有盒子有足够的容量来存储该物品,所以答案是 -1。
约束条件:
1 <= capacity.length <= 1001 <= capacity[i] <= 1001 <= itemSize <= 100
解题思路
这道题的核心思路是找到能够装下物品的最小容量盒子,如果有多个相同容量的盒子,选择索引最小的。
解法分析:
方法一:一次遍历法(推荐)
- 遍历整个数组,维护两个变量:最小有效容量和对应的索引
- 对于每个盒子,如果容量大于等于物品大小且小于当前记录的最小容量,则更新记录
- 如果容量等于当前记录的最小容量但索引更小,也需要更新(虽然这种情况在单次遍历中不会发生)
- 时间复杂度O(n),空间复杂度O(1)
方法二:两次遍历法
- 第一次遍历找出所有能装下物品的盒子中的最小容量
- 第二次遍历找出具有该最小容量的最小索引
- 时间复杂度O(n),空间复杂度O(1)
由于题目数据规模较小,两种方法性能相近,但一次遍历法更简洁高效。
代码实现
class Solution {
public:
int minimumIndex(vector<int>& capacity, int itemSize) {
int minCapacity = INT_MAX;
int result = -1;
for (int i = 0; i < capacity.size(); i++) {
if (capacity[i] >= itemSize && capacity[i] < minCapacity) {
minCapacity = capacity[i];
result = i;
}
}
return result;
}
};
class Solution:
def minimumIndex(self, capacity: list[int], itemSize: int) -> int:
min_capacity = float('inf')
result = -1
for i, cap in enumerate(capacity):
if cap >= itemSize and cap < min_capacity:
min_capacity = cap
result = i
return result
public class Solution {
public int MinimumIndex(int[] capacity, int itemSize) {
int minCapacity = int.MaxValue;
int result = -1;
for (int i = 0; i < capacity.Length; i++) {
if (capacity[i] >= itemSize && capacity[i] < minCapacity) {
minCapacity = capacity[i];
result = i;
}
}
return result;
}
}
var minimumIndex = function(capacity, itemSize) {
let minCapacity = Infinity;
let result = -1;
for (let i = 0; i < capacity.length; i++) {
if (capacity[i] >= itemSize && capacity[i] < minCapacity) {
minCapacity = capacity[i];
result = i;
}
}
return result;
};
复杂度分析
| 复杂度类型 | 复杂度 |
|---|---|
| 时间复杂度 | O(n) |
| 空间复杂度 | O(1) |
其中 n 是盒子数组的长度。算法只需要遍历一次数组,使用常数额外空间。