第K个语法符号
难度:
标签:
题目描述
代码结果
运行时间: 24 ms, 内存: 0.0 MB
/*
* 思路:
* 1. 我们可以使用Java Stream来简化递归过程。
* 2. 使用一个递归函数,根据索引判断是0还是1。
*/
import java.util.stream.IntStream;
public class Solution {
public int kthGrammar(int n, int k) {
// 使用IntStream进行递归查找
return IntStream.iterate(n, i -> i > 1, i -> i - 1)
.map(i -> k <= (1 << (i - 1)) / 2 ? 0 : 1)
.reduce((a, b) -> b == 0 ? a : 1 - a)
.orElse(0);
}
}
解释
方法:
这个题解采用了二分查找的思路。根据题目的规律可以发现,每一行的前一半和后一半是完全对称的,且后一半的数字与前一半相反。利用这个特点,我们可以在每一层二分查找需要的数字是在前一半还是后一半,然后递归到下一层继续查找。通过这种方式,我们可以在对数时间内找到第 k 个数字。
时间复杂度:
O(n)
空间复杂度:
O(1)
代码细节讲解
🦆
在题解中,如何确定每一行的前一半和后一半是对称的,并且后一半的数字与前一半相反?
▷🦆
为什么在每次循环的最后,当前数字`cur`需要根据其原值进行取反操作?具体是基于什么规则?
▷🦆
题解中提到了二分查找的左右边界从1到2的(n-1)次方,这个边界的确定是如何理解的?为什么选择这个范围?
▷🦆
题解中提到的二分查找逻辑是否能确保在所有情况下都能准确地找到第k个数字?是否有可能存在某些边界条件下的错误?
▷