news 2026/4/21 13:27:16

Kimi LeetCode 1643.第 K 条最小指令 public String kthSmallestPath(int[] destination, int k)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Kimi LeetCode 1643.第 K 条最小指令 public String kthSmallestPath(int[] destination, int k)

我来帮你解决 LeetCode 1643. 第 K 条最小指令 这道题。

题目分析

- 从 `(0, 0)` 走到 `(row, col)`,只能向右走 `'H'` (Horizontal) 或向下走 `'V'` (Vertical)
- 需要找字典序第 `k` 小的路径
- 字典序规则:`'H' < 'V'`,所以优先放 `'H'` 能得到更小的字典序

解题思路

这是一个组合数学问题。假设需要 `h` 个 `'H'` 和 `v` 个 `'V'`:

1. 关键观察:当前位置选择 `'H'` 后,后面可以形成的不同路径数为 `C(h+v-1, h-1)`(从剩余位置中选 `'H'` 的位置)

2. 决策过程:
- 如果 `k <= C(h+v-1, h-1)`:说明第 k 小的路径以 `'H'` 开头,选 `'H'`
- 否则:说明第 k 小的路径以 `'V'` 开头,选 `'V'`,同时 `k -= C(h+v-1, h-1)`

3. 组合数计算:使用杨辉三角或动态规划预处理,注意数值范围(`k` 最大为 `10^9`)

代码实现

```java
class Solution {
public String kthSmallestPath(int[] destination, int k) {
int v = destination[0]; // 需要向下走的次数 (Vertical)
int h = destination[1]; // 需要向右走的次数 (Horizontal)

// 预处理组合数 C[n][m] = C(n,m)
// 最大需要 C(30,15) 左右,因为 h+v <= 30
long[][] C = new long[h + v + 1][h + v + 1];
for (int i = 0; i <= h + v; i++) {
C[i][0] = C[i][i] = 1;
for (int j = 1; j < i; j++) {
// 防止溢出,但 k <= 1e9,所以超过的直接设为 k+1
C[i][j] = Math.min(C[i-1][j-1] + C[i-1][j], (long)k + 1);
}
}

StringBuilder sb = new StringBuilder();

while (h > 0 && v > 0) {
// 如果当前选 'H',后面还有 h+v-1 个位置,需要选 h-1 个 'H'
long countH = C[h + v - 1][h - 1];

if (k <= countH) {
// 第 k 个在 'H' 开头的序列中
sb.append('H');
h--; // 还需要 h-1 个 'H'
} else {
// 第 k 个在 'V' 开头的序列中
sb.append('V');
k -= countH; // 跳过所有 'H' 开头的序列
v--; // 还需要 v-1 个 'V'
}
}

// 剩余的全是 'H' 或全是 'V'
while (h-- > 0) sb.append('H');
while (v-- > 0) sb.append('V');

return sb.toString();
}
}
```

复杂度分析

- 时间复杂度:O((h+v)²),预处理组合数 + 构造答案
- 空间复杂度:O((h+v)²),存储组合数

关键点说明

要点 说明
字典序 `'H' < 'V'`,所以优先尝试 `'H'`
组合数上限 用 `min(..., k+1)` 防止溢出,因为只需要和 `k` 比较
贪心策略 每一步确定当前位,缩小问题规模

示例验证

以 `destination = [2,3], k = 1` 为例:
- 需要 3 个 `'H'`,2 个 `'V'`
- 所有路径按字典序排列,第 1 个是 `"HHHVV"`
- 算法:每次优先选 `'H'`,k=1 始终 <= C(4,2)=6,所以一直选 `'H'` 直到用完

以 `destination = [2,3], k = 3` 为例:
- 第 1,2 个是 `"HHHVV"`, `"HHVHV"`
- 第 3 个是 `"HHVVH"` ✓

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

Java静态编译内存失控真相(GraalVM 22.3+内存优化黄金配置手册)

第一章&#xff1a;Java静态编译内存失控真相揭幕Java 静态编译&#xff08;如 GraalVM Native Image&#xff09;在追求启动速度与资源轻量化的道路上&#xff0c;常因内存模型误判引发严重失控现象——并非堆内存溢出&#xff0c;而是原生镜像构建阶段的元数据膨胀与运行时动…

作者头像 李华
网站建设 2026/4/21 13:14:19

如何快速掌握小红书批量下载神器:XHS-Downloader完整使用指南

如何快速掌握小红书批量下载神器&#xff1a;XHS-Downloader完整使用指南 【免费下载链接】XHS-Downloader 小红书&#xff08;XiaoHongShu、RedNote&#xff09;链接提取/作品采集工具&#xff1a;提取账号发布、收藏、点赞、专辑作品链接&#xff1b;提取搜索结果作品、用户链…

作者头像 李华
网站建设 2026/4/21 13:11:34

仅限产线运维总监查阅:27套已稳定运行超18个月的Docker工业镜像构建规范(含CVE-2023-XXXX零容忍基线)

第一章&#xff1a;Docker工业容器部署的合规性与产线准入总则在工业自动化与智能制造场景中&#xff0c;Docker容器的部署不再仅关乎功能实现&#xff0c;更需满足安全基线、等保2.0三级要求、IEC 62443-3-3工业信息安全标准及企业级产线准入规范。未经合规审查的镜像禁止进入…

作者头像 李华
网站建设 2026/4/21 13:11:13

华为交换机堆叠:从核心概念到稳定运行的实战配置解析

1. 华为交换机堆叠的核心概念 第一次接触华为交换机堆叠技术时&#xff0c;我也被各种专业术语搞得一头雾水。直到实际部署了几次之后才发现&#xff0c;这套系统其实就像组建一个高效的团队&#xff0c;每个成员都有明确的分工和协作机制。让我们用最直白的语言&#xff0c;拆…

作者头像 李华