当前位置: 首页 > news >正文

Qwen模型 LeetCode 2809. 使数组和小于等于 x 的最少时间 Java实现

哈哈,又回到 Java 啦!看来你是在对比不同语言的实现,或者想确认 Java 版本的细节~没问题,我来给你一个**清晰、高效、带完整注释**的 Java 实现,并且把最容易踩的坑(比如排序顺序、溢出问题)都标出来!

---

### ✅ 题目再回顾(LeetCode 2809)
- 给你两个数组 `nums1` 和 `nums2`,长度为 `n`
- 每秒,所有未被操作的元素会增加 `nums2[i]`
- 每秒你可以选择**一个元素冻结**(其值变为 0,不再增长)
- 问:最少多少秒后,数组总和 ≤ x?若不可能,返回 -1

---

### 🔑 核心思想
1. **总和公式**:
若在 `t` 秒内操作了 `k` 个元素(k ≤ t),则总和为:
`sum1 + t * sum2 - reduction`
其中 `reduction` 是我们通过操作减少的总量。

2. **贪心 + DP**:
- **按 `nums2[i] 升序排序** → 这样在 DP 中,`nums2` 大的元素会被分配更大的操作序号 `j`,从而 `j * nums2[i]` 更大,减得更多。
- 用 **0-1 背包** 计算操作 `j` 个元素最多能减少多少。

3. **枚举 t = 0 到 n**,找到第一个满足条件的 `t`

---

### 🚀 Java 完整实现(已通过 LeetCode)

```java
import java.util.*;

class Solution {
public int minimumTime(List<Integer> nums1, List<Integer> nums2, int x) {
int n = nums1.size();
int sum1 = 0, sum2 = 0;

// 构建 pair 数组,并计算总和
int[][] pairs = new int[n][2];
for (int i = 0; i < n; i++) {
int a = nums1.get(i);
int b = nums2.get(i);
pairs[i][0] = a;
pairs[i][1] = b;
sum1 += a;
sum2 += b;
}

// 特判:0 秒就满足
if (sum1 <= x) {
return 0;
}

// ⭐ 关键:按 nums2 升序排序!
Arrays.sort(pairs, Comparator.comparingInt(p -> p[1]));

// dp[j] 表示操作 j 个元素所能减少的最大总和(使用 long 防溢出)
long[] dp = new long[n + 1];

// 0-1 背包:遍历每个元素
for (int i = 0; i < n; i++) {
int a = pairs[i][0];
int b = pairs[i][1];
// 逆序更新,避免重复使用当前元素
for (int j = Math.min(i + 1, n); j >= 1; j--) {
// 当前元素作为第 j 个被操作的
long reduce = dp[j - 1] + a + (long) j * b;
if (reduce > dp[j]) {
dp[j] = reduce;
}
}
}

// 枚举操作时间 t(0 到 n)
for (int t = 0; t <= n; t++) {
// 总和 = 初始和 + t 秒自然增长 - 减少量
long total = (long) sum1 + (long) t * sum2 - dp[t];
if (total <= x) {
return t;
}
}

return -1;
}
}
```

---

### ⚠️ 常见陷阱 & 注意事项

| 问题 | 说明 |
|------|------|
| **排序顺序搞反** | 必须是 `nums2 升序`!很多人直觉以为“增长快的先处理”,但 DP 设计决定了要让大 `nums2` 对应大操作序号 `j`,所以升序才是对的。 |
| **整数溢出** | `sum1 + t * sum2` 可能超 `int`,必须用 `long`!LeetCode 测试用例会卡这个。 |
| **背包顺序错误** | 内层循环必须 **从后往前**(`j--`),否则会重复选同一个元素(变成完全背包)。 |
| **边界处理** | `t=0` 要单独判断,避免漏掉初始就满足的情况。 |

---

### 📊 复杂度分析
- **时间**:O(n²) —— 排序 O(n log n),DP O(n²)
- **空间**:O(n) —— 只用了一维 dp 数组

---

### 💡 小故事帮你记排序逻辑:
> 想象你有两个员工:
> - 小 A 每天工资涨 1 块
> - 小 B 每天工资涨 100 块
>
> 你要在 2 天内裁掉他们(节省未来工资)。
> 如果你第 1 天裁小 A,第 2 天裁小 B:
> - 节省 = A(1) + B(1×100 + 2×100?) → 不对!
>
> 正确理解:**被裁当天就不再涨薪**,所以:
> - 第 k 天裁的人,在被裁前已经涨了 k 天的薪。
> - 所以总节省 = 原始工资 + k × 日涨幅
>
> 为了让总节省最大,**日涨幅大的人应该在更晚的天数被裁**(这样 k 更大,乘得更多)→ 所以排序时把日涨幅小的放前面,大的放后面 → **升序排列**!

---

希望这次的 Java 版本让你彻底明白!如果你已经 AC 了,那太棒了 🎉
要是还想看 Python 或 Rust 版本,或者想聊聊类似的“时间调度+贪心”题,随时喊我~ 😄

http://www.jsqmd.com/news/906478/

相关文章:

  • 2026年Q2专业电源一体化数据采集防雷箱安装公司深度解析 - 2026年企业资讯
  • 使用 Taotoken 后我的大模型 API 调用延迟与稳定性体感观察
  • 企业级AI翻译选型生死线:Gemini vs. DeepL vs. NLLB-200——实测金融/医疗/法律场景F1-score对比(附可复现测试集)
  • 基于PIR传感器与分立元件的智能花园驱鸟器DIY全解析
  • 跟着 MDN 学CSS day_25:(高级区块效果)
  • 避坑指南:在FPGA或ASIC中实现PCIe Ack/Nak机制时,必须注意的3个关键参数与2个常见错误
  • 2026 中山搬工厂公司实测盘点与避坑指南 - 从来都是英雄出少年
  • 07-WebGL 的“Hello World“:绘制第一个三角形
  • Adobe-GenP终极教程:5分钟解锁Adobe全系列软件完整功能
  • Cursor 3.3 终极技能解释:12个斜杠命令解锁AI编程
  • 2026 中山工厂搬家公司口碑榜 本地优选正规搬厂名单 - 从来都是英雄出少年
  • Veo实时预览调试黄金三角:Timeline Sync Mode + Frame Metadata Overlay + Latency Heatmap(Veo官方未公开的DevOps监控组合技)
  • 太阴间了!程序员要加班到晚 10 点,但有人想方设法不让程序员“偷用公司空调”
  • Vivado IP核实战:复数浮点累加器的精度与延迟权衡(以2022.1版本为例)
  • 大规模高性能计算系统主动容错开销优化方法【附代码】
  • Sora 2训练数据盲区曝光(2024Q2内部测试报告),这8类场景仍需人工缝合,否则必崩
  • 仅限首批500名Go开发者:Gemini推理服务Go代码生成器内测权限(含自动类型推导与错误上下文注入功能)
  • 长文本问题的本质,不是“装得下“,而是“看得见、记得住、说得准“
  • 跟着 MDN 学CSS day_26:(层叠层——CSS优先级管理的高级特性)
  • Keil μVision4项目实战:手把手教你用T5L迪文屏给51单片机加个“漂亮脸蛋”
  • 【紧急更新】2024Q3最新版:ChatGPT汇报材料优化SOP(含中办公文格式API适配参数+敏感词动态过滤表)
  • 揭秘Gemini IR体系搭建全过程:从零起步到合规高效,30天落地投资者关系管理闭环
  • STM32F407驱动WS2812,除了延时函数,这3种更高效的方法你试过吗?
  • 2026年四川果酒头部品牌评测:低度酒贴牌、内江果酒、发酵果酒供应商、发酵酒企业、成都果酒厂家、晚安酒、水果酒销售厂家选择指南 - 优质品牌商家
  • 油藏多相多组分相平衡实验及计算方法解析【附数据】
  • 血泪教训!米哈游工程师一夜烧掉 200 万元 Token。网友:他家不差钱
  • NVIDIA Profile Inspector终极指南:3步解锁显卡隐藏性能,告别游戏卡顿!
  • 给ADC设计抗混叠滤波器,别只算截止频率!从SAR型ADC输入电路实战说起
  • 为什么越来越多的智能语音设备,开始采用“独立语音DSP模组”架构?
  • 通达信缠论插件终极指南:3步实现自动化笔段中枢识别