LeetCode:779 第K个语法符号 递归解法
在第一行我们写上一个 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)].
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/k-th-symbol-in-grammar
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
思路
这一行的第n个字符是由上一行第(n+1)/2个字符决定的
例:
第三行: 0110
第四行: 01101001
第四行第1,2
个字符是由第三行第1
个字符决定的
第四行第3,4
个字符是由第三行第2
个字符决定的
第四行第5,6
个字符是由第三行第3
个字符决定的
第四行第7,8
个字符是由第三行第4
个字符决定的
求取第N行第K个字符,转变为求取第N-1行第(K+1)/2个字符
如果第N-1行第(K+1)/2个字符为1,K为奇数,那么第N行第K个字符为1
如果第N-1行第(K+1)/2个字符为0,K为奇数,那么第N行第K个字符为0
如果第N-1行第(K+1)/2个字符为1,K为偶数,那么第N行第K个字符为0
如果第N-1行第(K+1)/2个字符为1,K为偶数,那么第N行第K个字符为1
递归边界:N=0,第一行一定是0,return 0
代码
class Solution {
public:
int kthGrammar(int N, int K) {
if(N == 1)
{
return 0;
}
if(K%2 == 0)
{
int res = kthGrammar(N-1, (K-1)/2+1);
if(res)
{
return 0;
}
else
{
return 1;
}
}
else
{
int res = kthGrammar(N-1, K/2+1);
if(res)
{
return 1;
}
else
{
return 0;
}
}
}
};