news 2026/5/22 0:21:24

Kimi LeetCode 2547. 拆分数组的最小代价 C++实现

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Kimi LeetCode 2547. 拆分数组的最小代价 C++实现

这道题的核心思路是动态规划 + 记忆化搜索。我们定义 `dfs(i)` 为从下标 `i` 开始拆分数组的最小代价,答案即为 `dfs(0)`。

关键观察

子数组的重要性 = `k + trimmed(subarray).length`。其中 `trimmed` 操作会移除子数组中只出现一次的数字。

如果我们用 `cnt[x]` 记录数字 `x` 在当前子数组中的出现次数,用 `one` 记录出现次数恰好为 1 的数字个数,那么:
- `trimmed(subarray).length = 子数组总长度 - one`
- 重要性 = `k + (j - i + 1) - one`

算法设计

在 `dfs(i)` 中,枚举子数组的右端点 `j`(从 `i` 到 `n-1`),同时维护一个计数数组和 `one` 变量:
- 当 `nums[j]` 第一次出现时,`one++`
- 当 `nums[j]` 第二次出现时,它从"唯一"变成"重复",所以 `one--`
- 第三次及以上出现,`one` 不变

转移方程:

```
dfs(i) = min{ k + (j - i + 1 - one) + dfs(j + 1) } 对所有 j ≥ i
```

使用记忆化数组 `f[i]` 避免重复计算。

C++ 实现

```cpp
class Solution {
public:
int minCost(vector<int>& nums, int k) {
int n = nums.size();
// f[i] 表示从下标 i 开始拆分的最小代价,0 表示未计算
// 注意:题目保证答案为正,所以可以用 0 作为未访问标记
vector<int> f(n, 0);

function<int(int)> dfs = [&](int i) -> int {
if (i >= n) return 0;
if (f[i] != 0) return f[i];

// cnt[x] 记录子数组中数字 x 的出现次数
// 由于 nums[i] < n,可以用数组代替哈希表
vector<int> cnt(n, 0);
int one = 0; // 出现次数为 1 的数字个数
int ans = INT_MAX;

for (int j = i; j < n; ++j) {
int x = ++cnt[nums[j]];
if (x == 1) {
++one; // 新出现的唯一数字
} else if (x == 2) {
--one; // 从唯一变成重复
}
// x >= 3 时,one 不变(已经是重复数字)

// 当前子数组 [i, j] 的重要性:k + 长度 - one
int cost = k + (j - i + 1 - one) + dfs(j + 1);
ans = min(ans, cost);
}

f[i] = ans;
return ans;
};

return dfs(0);
}
};
```

复杂度分析

- 时间复杂度:O(n^2)。每个状态 `dfs(i)` 最多计算一次,每次计算需要 O(n) 的枚举。
- 空间复杂度:O(n)。记忆化数组和递归栈的空间。

示例验证

以 `nums = [1,2,1,2,1,3,3], k = 2` 为例:
- 拆分为 `[1,2]` 和 `[1,2,1,3,3]`
- 第一个子数组:2 + (2 - 2) = 2(1 和 2 都只出现一次,trimmed 后长度为 0)
- 第二个子数组:2 + (5 - 3) = 6(1 出现 3 次,2 出现 1 次,3 出现 2 次;仅出现一次的是 2,所以 trimmed 长度为 4?不对,重新算:1 出现 3 次保留,2 出现 1 次移除,3 出现 2 次保留,trimmed = [1,1,3,3],长度为 4,重要性 = 2 + 4 = 6)
- 总代价 = 2 + 6 = 8 ✓

参考实现来自 LeetCode 官方题解和 Doocs 开源社区 。

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

【PC】MToolsv0.1.0一款宝藏级电脑多媒体处理工具箱

【PC】MToolsv0.1.0一款宝藏级电脑多媒体处理工具箱 链接&#xff1a;https://pan.xunlei.com/s/VOt9djutjtaudN70tesyS3QYA1?pwdhpbr# 说明&#xff1a;一款功能强大、界面精美的现代化桌面工具&#xff0c;集成图片处理、音视频编辑、AI 智能工具、开发辅助等功能&#xff0…

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

新旧版鸿蒙系统的区别详解——升级前必读指南

新旧版鸿蒙系统的区别详解——升级前必读指南纯血鸿蒙同旧版鸿蒙的主要区别在于&#xff1a;老版本底层依赖Android框架进行兼容&#xff0c;而新一代则实现了完全自主研发。HarmonyOS 5标志着纯血鸿蒙时代的开启&#xff0c;目前最新的HarmonyOS 6.1版本功能完善。一、简明对比…

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

从零开始:5分钟掌握Mermaid Live Editor,告别复杂图表绘制烦恼

从零开始&#xff1a;5分钟掌握Mermaid Live Editor&#xff0c;告别复杂图表绘制烦恼 【免费下载链接】mermaid-live-editor Edit, preview and share mermaid charts/diagrams. New implementation of the live editor. 项目地址: https://gitcode.com/GitHub_Trending/me/…

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

从被动响应到主动行动:AI Agent的自主性革命

从被动响应到主动行动:AI Agent的自主性革命 标题选项 《从被动响应到主动行动:AI Agent如何开启下一代人工智能的自主性革命》 《告别“一问一答”:拆解AI Agent的自主决策逻辑,看懂下一代AI的核心方向》 《从ChatGPT到自主Agent:人工智能的下一个拐点,到底革了谁的命?…

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

基于地铁客流数据的智能问答系统:结合大模型与SGLang推理加速

基于地铁客流数据的智能问答系统:结合大模型与SGLang推理加速 摘要 随着城市轨道交通网络的快速发展,地铁客流量数据呈现爆炸式增长,如何从海量客流数据中快速获取有价值的信息成为亟待解决的问题。本文基于地铁客流数据构建知识库,利用大语言模型实现智能问答功能,并采…

作者头像 李华