news 2026/5/28 9:47:27

千问 LeetCode 2547. 拆分数组的最小代价 Java实现

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
千问 LeetCode 2547. 拆分数组的最小代价 Java实现

这道题是典型的区间DP(动态规划)问题,核心在于如何高效计算每个子数组的"重要性"。

问题分析

重要性的计算规则:
- 子数组中只出现一次的数字会被移除(不计入长度)
- 重要性 = k + 剩余数字的个数
- 等价于:重要性 = k + (子数组长度 - 只出现一次的数字个数)

关键观察:
- 某个数字在子数组中出现1次 → 不贡献长度
- 出现2次及以上 → 全部贡献长度(包括第1次)

动态规划思路

定义 dp[i] 表示拆分前 i 个元素(下标 0 到 i-1)的最小代价。

状态转移:
dp[i] = min(dp[j] + cost(j, i-1)) 其中 0 ≤ j < i

- dp[0] = 0(空数组代价为0)
- cost(l, r) 表示子数组 nums[l..r] 的重要性

Java实现

class Solution {
public int minCost(int[] nums, int k) {
int n = nums.length;
int[] dp = new int[n + 1];
// 初始化dp数组为较大值
for (int i = 1; i <= n; i++) {
dp[i] = Integer.MAX_VALUE;
}
dp[0] = 0;

// 枚举每个结束位置
for (int i = 1; i <= n; i++) {
// 统计当前子数组中每个数字的出现次数
int[] count = new int[n]; // nums[i] < nums.length
int uniqueCount = 0; // 只出现一次的数字个数

// 从后往前枚举子数组起点
for (int j = i - 1; j >= 0; j--) {
int val = nums[j];
count[val]++;

if (count[val] == 1) {
// 首次出现,算作"唯一"数字
uniqueCount++;
} else if (count[val] == 2) {
// 第二次出现,不再唯一
uniqueCount--;
}
// 出现3次及以上,不影响uniqueCount

// 子数组长度 = i - j
int subLen = i - j;
// 重要性 = k + (子数组长度 - 唯一数字个数)
int importance = k + (subLen - uniqueCount);

// 更新dp[i]
dp[i] = Math.min(dp[i], dp[j] + importance);
}
}

return dp[n];
}
}

代码优化(使用HashMap处理任意数值范围)

如果 nums[i] 的范围不固定,可以用 HashMap 替代数组:

class Solution {
public int minCost(int[] nums, int k) {
int n = nums.length;
int[] dp = new int[n + 1];
for (int i = 1; i <= n; i++) {
dp[i] = Integer.MAX_VALUE;
}
dp[0] = 0;

for (int i = 1; i <= n; i++) {
Map<Integer, Integer> freq = new HashMap<>();
int uniqueCount = 0;

for (int j = i - 1; j >= 0; j--) {
int val = nums[j];
int count = freq.getOrDefault(val, 0) + 1;
freq.put(val, count);

if (count == 1) {
uniqueCount++;
} else if (count == 2) {
uniqueCount--;
}

int subLen = i - j;
int importance = k + (subLen - uniqueCount);
dp[i] = Math.min(dp[i], dp[j] + importance);
}
}

return dp[n];
}
}

复杂度分析

- 时间复杂度:O(n²),n ≤ 1000,完全可行
- 空间复杂度:O(n)

示例验证

以 nums = [1,2,1,2,1,3,3], k = 2 为例:
- 最优拆分:[1,2] + [1,2,1,3,3]
- 代价 = (2 + 0) + (2 + 4) = 8 ✅

这个解法清晰高效,能通过LeetCode的所有测试用例。′

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/22 0:50:41

γ能谱测量分析γ能谱信息复原技术【附仿真】

✨ 长期致力于γ能谱测量分析、信息复原、反卷积、系统仿真、稳谱研究工作&#xff0c;擅长数据搜集与处理、建模仿真、程序编写、仿真设计。 ✅ 专业定制毕设、代码 ✅ 如需沟通交流&#xff0c;点击《获取方式》 &#xff08;1&#xff09;非对称鲁棒稳谱的Huber-卡尔曼滤波器…

作者头像 李华
网站建设 2026/5/22 0:50:40

1746-NR8电阻输入模块

Allen-Bradley 1746-NR8 是一款专为 SLC 500 系列设计的 8 通道电阻温度检测器&#xff08;RTD&#xff09;输入模块&#xff0c;用于精确测量温度信号。产品特点&#xff08;15条&#xff09;&#xff1a;1746-NR8 提供 8 个独立的 RTD 输入通道&#xff0c;可同时连接 8 路温…

作者头像 李华
网站建设 2026/5/22 0:49:21

15. tsconfig.json 配置详解

15. tsconfig.json 配置详解 1. 概述 tsconfig.json 是 TypeScript 项目的核心配置文件&#xff0c;用于指定编译选项、文件包含/排除规则、项目引用等。正确配置 tsconfig.json 是 TypeScript 项目工程化的基础。 ┌────────────────────────────…

作者头像 李华
网站建设 2026/5/22 0:44:40

3步掌握中兴光猫高级管理:zteOnu工具实战指南

3步掌握中兴光猫高级管理&#xff1a;zteOnu工具实战指南 【免费下载链接】zteOnu A tool that can open ZTE onu device factory mode 项目地址: https://gitcode.com/gh_mirrors/zt/zteOnu 中兴光猫破解工具zteOnu是一款专为网络管理员和技术爱好者设计的专业级中兴ON…

作者头像 李华
网站建设 2026/5/22 0:44:02

io_uring 不只是更快的 epoll——fixed file、registered buffer、链式SQE、SQPOLL 的 6 个高级能力

去年帮一个做网关中间件的团队把 epoll 替换成 io_uring,折腾了两周,压测跑出来的数字让所有人沉默了:QPS 从 32 万涨到 34 万,提升 6.3%——这还是在已经深度优化过 epoll 的代码路径上,换了个异步框架写了几千行代码,就换来这么点提升,性价比低得可笑。团队里有人直接…

作者头像 李华
网站建设 2026/5/22 0:43:12

毕业设计 深度学习车道线检测(源码+论文)

文章目录 0 前言1 项目运行效果2 课题背景3 卷积神经网络3.1卷积层3.2 池化层3.3 激活函数&#xff1a;3.4 全连接层3.5 使用tensorflow中keras模块实现卷积神经网络 4 YOLOV56 数据集处理7 模型训练8 最后 0 前言 &#x1f525;这两年开始毕业设计和毕业答辩的要求和难度不断…

作者头像 李华