Welcome to Subscribe On Youtube
1643. Kth Smallest Instructions
Description
Bob is standing at cell (0, 0)
, and he wants to reach destination
: (row, column)
. He can only travel right and down. You are going to help Bob by providing instructions for him to reach destination
.
The instructions are represented as a string, where each character is either:
'H'
, meaning move horizontally (go right), or'V'
, meaning move vertically (go down).
Multiple instructions will lead Bob to destination
. For example, if destination
is (2, 3)
, both "HHHVV"
and "HVHVH"
are valid instructions.
However, Bob is very picky. Bob has a lucky number k
, and he wants the kth
lexicographically smallest instructions that will lead him to destination
. k
is 1-indexed.
Given an integer array destination
and an integer k
, return the kth
lexicographically smallest instructions that will take Bob to destination
.
Example 1:
Input: destination = [2,3], k = 1 Output: "HHHVV" Explanation: All the instructions that reach (2, 3) in lexicographic order are as follows: ["HHHVV", "HHVHV", "HHVVH", "HVHHV", "HVHVH", "HVVHH", "VHHHV", "VHHVH", "VHVHH", "VVHHH"].
Example 2:
Input: destination = [2,3], k = 2 Output: "HHVHV"
Example 3:
Input: destination = [2,3], k = 3 Output: "HHVVH"
Constraints:
destination.length == 2
1 <= row, column <= 15
1 <= k <= nCr(row + column, row)
, wherenCr(a, b)
denotesa
chooseb
.
Solutions
-
class Solution { public String kthSmallestPath(int[] destination, int k) { int v = destination[0], h = destination[1]; int n = v + h; int[][] c = new int[n + 1][h + 1]; c[0][0] = 1; for (int i = 1; i <= n; ++i) { c[i][0] = 1; for (int j = 1; j <= h; ++j) { c[i][j] = c[i - 1][j] + c[i - 1][j - 1]; } } StringBuilder ans = new StringBuilder(); for (int i = n; i > 0; --i) { if (h == 0) { ans.append('V'); } else { int x = c[v + h - 1][h - 1]; if (k > x) { ans.append('V'); k -= x; --v; } else { ans.append('H'); --h; } } } return ans.toString(); } }
-
class Solution { public: string kthSmallestPath(vector<int>& destination, int k) { int v = destination[0], h = destination[1]; int n = v + h; int c[n + 1][h + 1]; memset(c, 0, sizeof(c)); c[0][0] = 1; for (int i = 1; i <= n; ++i) { c[i][0] = 1; for (int j = 1; j <= h; ++j) { c[i][j] = c[i - 1][j] + c[i - 1][j - 1]; } } string ans; for (int i = 0; i < n; ++i) { if (h == 0) { ans.push_back('V'); } else { int x = c[v + h - 1][h - 1]; if (k > x) { ans.push_back('V'); --v; k -= x; } else { ans.push_back('H'); --h; } } } return ans; } };
-
class Solution: def kthSmallestPath(self, destination: List[int], k: int) -> str: v, h = destination ans = [] for _ in range(h + v): if h == 0: ans.append("V") else: x = comb(h + v - 1, h - 1) if k > x: ans.append("V") v -= 1 k -= x else: ans.append("H") h -= 1 return "".join(ans)
-
func kthSmallestPath(destination []int, k int) string { v, h := destination[0], destination[1] n := v + h c := make([][]int, n+1) for i := range c { c[i] = make([]int, h+1) c[i][0] = 1 } for i := 1; i <= n; i++ { for j := 1; j <= h; j++ { c[i][j] = c[i-1][j] + c[i-1][j-1] } } ans := []byte{} for i := 0; i < n; i++ { if h == 0 { ans = append(ans, 'V') } else { x := c[v+h-1][h-1] if k > x { ans = append(ans, 'V') k -= x v-- } else { ans = append(ans, 'H') h-- } } } return string(ans) }