一个比较好理解、记忆和实现的生成算法如下:
假设我们已经有了两位的格雷码:00,01,11,10
,如何生成三位的格雷码呢?
第一步将其镜像翻转并添加到自身的队列后面,得到00,01,11,10,||10,11,01,00
。显然,除了镜像边缘的两个数(10和10),其他的数相邻之间都满足differ by 1 bit的关系。
然后,我们再将前一半的数最高位设为0,后一半的数最高位设为1,就得到000,001,011,010,||110,111,101,100
.此时,镜像边缘的两个数也满足differ by 1 bit的关系,而其他位置的数相邻之间的格雷码约束依然不变。于是,这就得到了三位的格雷码!
我们循环利用上述的算法,不断往后推进,可以得到任意n位数的格雷码!
LC 1238. Circular Permutation in Binary Representation 和本题一模一样。