<找规律>
<递归>
题目描述
在第一行我们写上一个 0
。接下来的每一行,将前一行中的0
替换为01
,1
替换为10
。
给定行数 N
和序数 K
,返回第 N
行中第 K
个字符。(K
从1开始)
例子:
输入: N = 1, K = 1 输出: 0 输入: N = 2, K = 1 输出: 0 输入: N = 2, K = 2 输出: 1 输入: N = 4, K = 5 输出: 1 解释: 第一行: 0 第二行: 01 第三行: 0110 第四行: 01101001
注意:
N
的范围[1, 30]
.K
的范围[1, 2^(N-1)]
.
我的思路 - 迭代
(误)
class Solution: def kthGrammar(self, N: int, K: int) -> int:
# 省略N=1,N=2的判定,初始从N=3开始 n = '01' pre = n for i in range(3,N+1): if i%2==1: n = n+n[::-1] else: n += pre[::-1]+pre pre=n return n
-
算法:
- 找规律,奇数行很简单,上一行 + 上一行的反转
- 偶数行 = 上一行 + 上一个偶数行的反转 + 上一个偶数行
-
2 01 3 0110 4 01101001 5 0110100110010110 6 01101001100101101001011001101001 7 0110100110010110100101100110100110010110011010010110100110010110
-
存在的问题:
- 虽然把时间优化了,但是2^30的空间还是爆炸性的!