LeetCode 89. Gray Code(格雷编码)


问题描述

LeetCode 89 问题描述 I
LeetCode 89 问题描述 II

思路与代码


格雷编码的要点:

  • 第一个数是 0
  • 每次只改变一位二进制编码
  • 第一个(0)和最后一个数的二进制编码只有一位差异

本文提供两种方法。

镜像反射法


题解中给出了一种镜像反射法,很巧妙。该方法的思路,每增加一阶时,只需要将上一阶的格雷码倒序排列,在每个编码最前面增加一个 1,然后拼接到上一阶的格雷码序列即可。

题解 镜像反射法

题解 镜像反射法

代码如下:

class Solution:
    def grayCode(self, n: int) -> List[int]:
        res, head = [0], 1  # intialise
        for i in range(n):
            for j in range(len(res) - 1, -1, -1):  # inverted order traversal
                res.append(head + res[j])  # concat
            head <<= 1
            
        return res

运行效果:
运行效果 1

右移异或法


格雷编码的一种经典的迭代方式是,每次变化尽可能低的位,前面的镜像反射法也是这样的流程。另一种实现方式是,对前一个格雷编码右移一位,然后与之进行按位亦或,所得结果即为下一个格雷编码。

这种方法也很巧妙,但具体原理笔者尚未理解。

代码如下:

class Solution:
    def grayCode(self, n: int) -> List[int]:
        list_res = []
        for i in range(1 << n):
            list_res.append(i ^ (i >> 1))

        return list_res

运行效果:
运行效果 2

猜你喜欢

转载自blog.csdn.net/Zhang_0702_China/article/details/121250463