1643. 第 K 条最小指令#
问题描述#
Bob 站在单元格
(0, 0),想要前往目的地destination:(row, column)。他只能向 右 或向 下 走。你可以为 Bob 提供导航 指令 来帮助他到达目的地destination。指令 用字符串表示,其中每个字符:
'H',意味着水平向右移动'V',意味着竖直向下移动能够为 Bob 导航到目的地
destination的指令可以有多种,例如,如果目的地destination是(2, 3),"HHHVV"和"HVHVH"都是有效 指令 。
然而,Bob 很挑剔。因为他的幸运数字是
k,他想要遵循 按字典序排列后的第k条最小指令 的导航前往目的地destination。k的编号 从 1 开始 。给你一个整数数组
destination和一个整数k,请你返回可以为 Bob 提供前往目的地destination导航的 按字典序排列后的第k条最小指令 。
示例 1:
输入:destination = [2,3], k = 1 输出:"HHHVV" 解释:能前往 (2, 3) 的所有导航指令 按字典序排列后 如下所示: ["HHHVV", "HHVHV", "HHVVH", "HVHHV", "HVHVH", "HVVHH", "VHHHV", "VHHVH", "VHVHH", "VVHHH"].示例 2:
输入:destination = [2,3], k = 2 输出:"HHVHV"示例 3:
输入:destination = [2,3], k = 3 输出:"HHVVH"
提示:
destination.length == 21 <= row, column <= 151 <= k <= nCr(row + column, row),其中nCr(a, b)表示组合数,即从a个物品中选b个物品的不同方案数。
解题思路#
无论怎么走,到达目的地都需要 v = destination[0] 个字符 "V" 以及 h = destination[1] 个字符 "H",且 "H" 的字典序比 "V" 小。
首先我们考虑第一个位置是放 "H" 还是放 "V"。
如果当前位置放 "H",则后面最多有 \(M=C_{v+h-1}^{v}\)(组合数,表示从 \(v+h-1\) 个数里面选择 \(v\) 个数)种可能走法,从字典序最小的 \(\underbrace{H\cdots H}_{h-1个\textbf{H}}\underbrace{V\cdots V}_{v个\textbf{V}}\) 到字典序最大的 \(\underbrace{V\cdots V}_{v个\textbf{V}}\underbrace{H\cdots H}_{h-1个\textbf{H}}\)。
用 \(S_H\) 表示字符串 \(H\underbrace{V\cdots V}_{v个\textbf{V}}\underbrace{H\cdots H}_{h-1个\textbf{H}}\),表示以 "H" 开头的 最大字典序。
用 \(S_V\) 表示字符串 \(V\underbrace{H\cdots H}_{h个\textbf{H}}\underbrace{V\cdots V}_{v-1个\textbf{V}}\),表示以 "V" 开头的 最小字典序。
如果:
-
\(M \gt k\),则当前位置显然要放置
"H",因为 \(M\) 代表字符串 \(S_H\) 按照字典序排列的位置,之后的字符无论如何排列,都会 小于等于 \(M\)。如果放置"V"的话,\(S_V\) 的字典序位置为 \(M+1\),无论之后的字符如何排列,都会 大于等于 \(M+1\)。 -
\(M \lt k\),则当前位置显然放置
"V",如果放置"H"的话,无论后面的的字符如何排列,也都到不了第 \(k\) 个字典序位置。此时放置完"V"之后,要将 \(k\) 减去 \(M\),因为之后的字符串 \(\underbrace{H\cdots H}_{h个\textbf{H}}\underbrace{V\cdots V}_{v-1个\textbf{V}}\) 排列是从 \(M+1\) 开始的。减去 \(M\) 后,问题变为了在包含 \(v-1\) 个"V"和 \(h\) 个"H"中的字符串排列中寻找第 \(k-M\) 个字典序排列。 -
如果 \(M=k\),则直接输出 \(S_H\) 即可。
之后每一步讨论重复以上过程。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | |


