🔗 题目链接:2279. 装满石头的背包的最大数量
📚 所属题单:灵茶山艾府 · 贪心算法题单 --- §1.1 从最小/最大开始贪心
🏷️ 难度:Medium | 难度分:1249
🔖 标签:贪心、数组、排序
📖 题目描述
现有 n 个背包。给你两个数组 capacity 和 rocks。第 i 个背包最大可以装 capacity[i] 块石头,当前已经装了 rocks[i] 块石头。另给你 additionalRocks 块额外的石头,可以往任意背包中放。
返回放置后装满石头的背包的最大数量。
示例 1
```
输入:capacity = [2,3,4,5], rocks = [1,2,4,4], additionalRocks = 2
输出:3
解释:1 块石头放入背包 0,1 块石头放入背包 1。
背包 0、1、2 都装满了。总计 3 个背包装满。
```
示例 2
```
输入:capacity = [10,2,2], rocks = [2,2,0], additionalRocks = 100
输出:3
解释:8 块石头放入背包 0,2 块石头放入背包 2。全部装满。
```
提示
1 <= n <= 5 * 10^41 <= capacity[i] <= 10^90 <= rocks[i] <= capacity[i]1 <= additionalRocks <= 10^9
💡 思路分析
每个背包还差 gap[i] = capacity[i] - rocks[i] 块石头才能装满。
要装满尽可能多的背包,应该优先填 gap 最小的------花最少的石头装满一个包,这样手里的额外石头就能多装几个。
就像你有一笔固定预算给空调房间补温,肯定先补差距最小的房间,这样能"达标"的房间最多 🏠
算法步骤
- 算差值 :
gap[i] = capacity[i] - rocks[i] - 排序:gap 从小到大排
- 贪心填充:从 gap 最小的开始,依次扣减 additionalRocks,直到石头不够
✅ 代码实现(Java)
```java
class Solution {
public int maximumBags(int[] capacity, int[] rocks, int additionalRocks) {
int n = capacity.length;
int[] gap = new int[n];
for (int i = 0; i < n; i++) {
gap[i] = capacity[i] - rocks[i];
}
Arrays.sort(gap);
int count = 0;
for (int i = 0; i < n; i++) {
if (gap[i] == 0) {
count++;
} else if (additionalRocks >= gap[i]) {
additionalRocks -= gap[i];
count++;
} else {
break;
}
}
return count;
}
}
```
📊 复杂度分析
| 复杂度 | 说明 | |
|---|---|---|
| ⏱️ 时间 | O(n log n) | 排序 |
| 💾 空间 | O(n) | gap 数组 |
🔗 参考
🎯 和前两题一脉相承------排序后从最小/最大开始贪心。这次是"差值最小的优先填",核心逻辑三行代码就搞定。