【灵神题单·贪心】2279. 装满石头的背包的最大数量 | 排序贪心 | Java

🔗 题目链接:2279. 装满石头的背包的最大数量

📚 所属题单:灵茶山艾府 · 贪心算法题单 --- §1.1 从最小/最大开始贪心

🏷️ 难度:Medium | 难度分:1249

🔖 标签:贪心、数组、排序

📖 题目描述

现有 n 个背包。给你两个数组 capacityrocks。第 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^4
  • 1 <= capacity[i] <= 10^9
  • 0 <= rocks[i] <= capacity[i]
  • 1 <= additionalRocks <= 10^9

💡 思路分析

每个背包还差 gap[i] = capacity[i] - rocks[i] 块石头才能装满。

要装满尽可能多的背包,应该优先填 gap 最小的------花最少的石头装满一个包,这样手里的额外石头就能多装几个。

就像你有一笔固定预算给空调房间补温,肯定先补差距最小的房间,这样能"达标"的房间最多 🏠

算法步骤

  1. 算差值gap[i] = capacity[i] - rocks[i]
  2. 排序:gap 从小到大排
  3. 贪心填充:从 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 数组

🔗 参考

🎯 和前两题一脉相承------排序后从最小/最大开始贪心。这次是"差值最小的优先填",核心逻辑三行代码就搞定。

相关推荐
Mike117.1 小时前
GBase 8a 数据同步实践:从 T+1 同步、实时镜像到一写多读的落地思路
java·服务器·数据库
qq_416018721 小时前
移动平台C++开发指南
开发语言·c++·算法
Nyarlathotep01131 小时前
LongAdder为什么那么快?
java·后端
自动化智库1 小时前
西门子S7-1200PLC与V90PN伺服基于FB284模块的定位控制应用
开发语言·科技
3GPP仿真实验室1 小时前
【MATLAB源码】CSI-RS:信道估计仿真与评估平台
开发语言·matlab
AI-小柒1 小时前
DataEyes 聚合平台 + Claude Code Max 编程实战
android·开发语言·人工智能·windows·python·macos·adb
王璐WL1 小时前
【C++】string的经典算法题
开发语言·c++·算法
毕设源码-邱学长1 小时前
【开题答辩全过程】以 列车信息查询系统为例,包含答辩的问题和答案
java
阿贵---1 小时前
C++中的工厂模式高级应用
开发语言·c++·算法