LC 779. 第 K 个语法符号
(opens new window) (opens new window)
中等
# 问题描述
我们构建了一个包含 n 行( 索引从 1 开始 )的表。首先在第一行我们写上一个 0。接下来的每一行,将前一行中的 0 替换为 01,1 替换为 10。
- 例如,对于
n = 3,第1行是0,第2行是01,第3行是0110。
给定行数 n 和序数 k,返回第 n 行中第 k 个字符。( k 从索引 1 开始)
示例 1:
输入: n = 1, k = 1
输出: 0
解释: 第一行:0
示例 2:
输入: n = 2, k = 1
输出: 0
解释:
第一行: 0
第二行: 01
示例 3:
输入: n = 2, k = 2
输出: 1
解释:
第一行: 0
第二行: 01
提示:
1 <= n <= 301 <= k <= 2n - 1
# 递归
不难发现,每一行的前半部分和上一行完全一致,后半部分是上一行的相反,那么会有以下两种情况:
- 如果 在前半部分,那么第 个字符就是上一行的第 个字符,直接递归 即可。
- 如果 在后半部分,那么第 个字符就是上一行的第 个字符的反转,即 。
/**
* @param {number} n
* @param {number} k
* @return {number}
*/
var kthGrammar = function (n, k) {
if (n === 1) return 0
const mid = 2 ** (n - 2)
if (k <= mid) {
return kthGrammar(n - 1, k)
} else {
return 1 ^ kthGrammar(n - 1, k - mid)
}
}
- 时间复杂度:
- 空间复杂度:
上次更新: 2023/01/31 19:48:05
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 , 转载请注明出处!