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

纳米AI LeetCode 1335.工作计划的最低难度 public int minDifficulty(int[] jobDifficulty, int d)

这是 LeetCode 第 1335 题《工作计划的最低难度》,核心是将工作任务分配到 `d` 天中,使得总难度(每天完成工作的最大难度之和)最小。以下是基于 **动态规划** 的最优解决方案:

---

## 一、问题核心规则
1. **输入**:工作难度数组 `jobDifficulty` 和天数 `d`
2. **约束**:工作必须按顺序完成,每天至少完成一项工作
3. **目标**:找到总难度最小的工作计划
4. **输出**:最小总难度;如果无法分配(工作总数 < `d`),返回 `-1`

---

## 二、关键思路分析
### 核心观察
1. 若工作总数 `n` < `d`,直接返回 `-1`(每天至少一项工作,无法分配)
2. 动态规划状态 `dp[i][j]` 表示前 `i` 天完成前 `j` 项工作的最小总难度
3. 状态转移:对于第 `i` 天,可以完成从 `k` 到 `j` 的工作(`k` 从 `i-1` 到 `j`),则:
- `dp[i][j] = min(dp[i][j], dp[i-1][k-1] + max(jobDifficulty[k..j]))`

### 关键优化
1. 预处理区间最大值:提前计算所有区间 `[k..j]` 的最大值,避免重复计算
2. 倒序遍历 `k`:在计算 `dp[i][j]` 时,从 `j` 倒序遍历到 `i-1`,可以动态维护区间最大值

---

## 三、完整可运行代码
```java
class Solution {
public int minDifficulty(int[] jobDifficulty, int d) {
int n = jobDifficulty.length;
// 特殊情况:工作总数小于天数,无法分配
if (n < d) {
return -1;
}

// dp[i][j] 表示前 i 天完成前 j 项工作的最小总难度
int[][] dp = new int[d + 1][n + 1];
// 初始化 dp 数组为无穷大
for (int i = 0; i <= d; i++) {
for (int j = 0; j <= n; j++) {
dp[i][j] = Integer.MAX_VALUE;
}
}

// 初始化:第 1 天完成前 j 项工作的难度是 [0..j-1] 的最大值
int maxDiff = 0;
for (int j = 1; j <= n; j++) {
maxDiff = Math.max(maxDiff, jobDifficulty[j - 1]);
dp[1][j] = maxDiff;
}

// 动态规划:填充 dp 数组
for (int i = 2; i <= d; i++) {
for (int j = i; j <= n; j++) { // 前 i 天至少需要完成 i 项工作
int currentMax = 0;
// 倒序遍历 k,动态维护区间 [k..j-1] 的最大值
for (int k = j; k >= i; k--) {
currentMax = Math.max(currentMax, jobDifficulty[k - 1]);
if (dp[i - 1][k - 1] != Integer.MAX_VALUE) {
dp[i][j] = Math.min(dp[i][j], dp[i - 1][k - 1] + currentMax);
}
}
}
}

return dp[d][n] == Integer.MAX_VALUE ? -1 : dp[d][n];
}
}
```

---

## 四、关键逻辑解释
### 1. 初始化
- `dp[1][j]` 表示第 1 天完成前 `j` 项工作的难度,即 `jobDifficulty[0..j-1]` 的最大值
- 其他 `dp[i][j]` 初始化为无穷大,表示不可达

### 2. 状态转移
- 对于第 `i` 天,必须至少完成 `i` 项工作(`j >= i`)
- 倒序遍历 `k`,从 `j` 到 `i`,动态维护 `jobDifficulty[k-1..j-1]` 的最大值
- `dp[i][j]` 取所有可能的 `dp[i-1][k-1] + currentMax` 中的最小值

### 3. 结果返回
- `dp[d][n]` 表示 `d` 天完成所有 `n` 项工作的最小总难度
- 若 `dp[d][n]` 仍为无穷大,返回 `-1`

---

## 五、复杂度分析
| 操作 | 时间复杂度 | 空间复杂度 |
|------|------------|------------|
| 初始化 | O(n) | O(d*n) |
| 状态转移 | O(d*n²) | O(d*n) |
| **总复杂度** | **O(d*n²)** | **O(d*n)** |
其中 `n` 是工作总数,`d` 是天数。

---

## 六、边界测试用例
```java
// 测试用例1:示例1
int[] jobDifficulty1 = {6,5,4,3,2,1};
System.out.println(new Solution().minDifficulty(jobDifficulty1, 2)); // 输出: 7(第一天完成前5项,难度6;第二天完成最后1项,难度1)

// 测试用例2:示例2
int[] jobDifficulty2 = {9,9,9};
System.out.println(new Solution().minDifficulty(jobDifficulty2, 4)); // 输出: -1(工作总数3 < 天数4,无法分配)

// 测试用例3:示例3
int[] jobDifficulty3 = {1,1,1};
System.out.println(new Solution().minDifficulty(jobDifficulty3, 3)); // 输出: 3(每天完成1项,总难度1+1+1=3)

// 测试用例4:示例4
int[] jobDifficulty4 = {7,1,7,1,7,1};
System.out.println(new Solution().minDifficulty(jobDifficulty4, 3)); // 输出: 15(分配为[7,1,7], [1,7], [1],难度7+7+1=15)
```

---

## 七、关键优化点
### 1. 动态维护区间最大值
倒序遍历 `k` 时,动态维护 `currentMax`,避免重复计算区间最大值,将时间复杂度从 O(d*n²) 优化为 O(d*n²)(常数级优化)

### 2. 空间优化
可以使用一维数组代替二维数组,只保留前一天的状态,将空间复杂度从 O(d*n) 优化为 O(n)

```java
class Solution {
public int minDifficulty(int[] jobDifficulty, int d) {
int n = jobDifficulty.length;
if (n < d) {
return -1;
}

int[] prevDp = new int[n + 1];
// 初始化第 1 天的状态
int maxDiff = 0;
for (int j = 1; j <= n; j++) {
maxDiff = Math.max(maxDiff, jobDifficulty[j - 1]);
prevDp[j] = maxDiff;
}

for (int i = 2; i <= d; i++) {
int[] currDp = new int[n + 1];
Arrays.fill(currDp, Integer.MAX_VALUE);
for (int j = i; j <= n; j++) {
int currentMax = 0;
for (int k = j; k >= i; k--) {
currentMax = Math.max(currentMax, jobDifficulty[k - 1]);
if (prevDp[k - 1] != Integer.MAX_VALUE) {
currDp[j] = Math.min(currDp[j], prevDp[k - 1] + currentMax);
}
}
}
prevDp = currDp;
}

return prevDp[n] == Integer.MAX_VALUE ? -1 : prevDp[n];
}
}
```

---

## 八、下一步建议
1. 尝试证明动态规划状态转移的正确性
2. 思考如何扩展到工作可以并行完成的情况
3. 验证算法在极端测试用例(如n=300,d=10)中的性能表现

如果需要进一步解释某个逻辑细节,请随时告诉我!
以上内容由AI搜集并生成,仅供参考

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

相关文章:

  • ArcGIS空间统计—Moran’s莫兰指数结果解读与置信度分析
  • Claude Code 源码泄露之后 我们更该盯住的不只是那五十多万行代码
  • 20253214 2025-2026-2 《Python程序设计》实验二报告
  • GME多模态向量-Qwen2-VL-2B部署教程:基于Docker Compose的多节点向量服务编排
  • Neo4j Desktop死活打不开?别急着重装,试试这个‘断网大法’(附详细日志排查步骤)
  • 无人机风速测量技术:直接与间接方法的深度解析
  • AI Agent是什么?与传统聊天机器人、自动化脚本的区别(2026最新定义)
  • 【照片转素描转手绘】智能图像艺术化引擎:从照片到素描手绘的一键转换
  • 用 Karpathy LLM Wiki 方法论,为 AI Agent 系统构建结构化知识层
  • Python性能瓶颈定位利器:py-spy实战深度解析
  • Qwen3-ASR-1.7B与算法优化:提升语音识别模型的实时性
  • 红外弱小目标检测:关键评价指标解析与MATLAB实现
  • 让机器学习势活过1000K——物理学告知的原子能量模型实现前所未有的模拟稳定性
  • 基于VHDL与FPGA的交互式打地鼠游戏系统设计
  • 26春 日总结18
  • 2026年4月高温高压阀门生产厂家推荐,中低压阀门/调节阀/特材阀门/衬氟阀门,高温高压阀门公司怎么选择 - 品牌推荐师
  • 统一建模语言(Unified Modeling Language,UML)是面向对象软件开发领域的标准建模语言
  • RAG文档切割入门到精通:彻底解决语义断裂,看这一篇就够了!
  • gridDim 最好是sm 的整数 吗
  • 20252321 实验二《Python程序设计》实验报告
  • 如何评估工商业储能电池厂家的技术成熟度?
  • [置顶]主页 - -minermouse
  • 学术回应:对“贾子定理KST-C-TMM 可证伪吗”的终极驳斥
  • 三菱FX3U与上位机通过FX-232-BD实现高效数据交互的实战解析
  • 基于Tasmota固件的ESP8266与PZEM-004T智能电表系统搭建指南(二):数据可视化与安全优化
  • 向量空间AI实验室AgentRAG
  • 编码超表面远场计算代码功能说明
  • 具身智能中的传感器技术24——六维力/力矩传感器2
  • 2026年青岛/市南区/市北区/黄岛区/崂山区/李沧区/城阳区/即墨区/胶州市/平度市发电机出租公司选择指南 - 海棠依旧大
  • 【树莓派系列】从零到一:新手必看的树莓派开箱配置全攻略