我是靠谱客的博主 狂野钢笔,最近开发中收集的这篇文章主要介绍3位格雷码的顺序编码_yiduobo的每日leetcode 89.格雷编码,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

6c43d5dd4f86c8260938a6f1e75fa20b.png

祖传的手艺不想丢了,所以按顺序写一个leetcode的题解。计划每日两题,争取不卡题吧。

89.格雷编码https://leetcode-cn.com/problems/gray-code/

比较有意思的题目。我在这里运用了一种类似动态规划的做法。

首先对于一种合法的格雷码,例如样例中的

00 - 0

01 - 1

11 - 3

10 - 2

我们将其反过来写,也一定是合法的,即:

10 - 2

11 - 3

01 - 1

00 - 0

那么,对于k位格雷码来说,可以在最高位上补0,看做k + 1位的格雷码作为前半部分,然后将这个k位格雷码反过来,在最高位补1作为k + 1位格雷码的后半部分。

还是样例中的2位的格雷码:

00 - 0

01 - 1

11 - 3

10 - 2

接下来要计算3位的格雷码,首先前半部分,照搬2位的格雷码然后在最高位补0:

0 00 - 0

0 01 - 1

0 11 - 3

0 10 - 2

然后后半部分,将2位格雷码反过来,然后在最高位补1:

1 10 - 6

1 11 - 7

1 01 - 5

1 00 - 4

这里主要就是利用了上面将格雷码反过来写依然合法这个原理。

具体实现时,先计算出最高位的值weight,也就是2的幂次,然后直接将上一轮的res反过来,加上这个最高位的值之后接在后面即可。

最后附上python代码:

class Solution(object):
    def grayCode(self, n):
        """
        :type n: int
        :rtype: List[int]
        """

        res = [0]

        for index in range(n):
            if index == 0:
                weight = 1
            else:
                weight += weight
            res.extend([res[pos] + weight for pos in range(len(res) - 1, -1, -1)])

        return res

最后

以上就是狂野钢笔为你收集整理的3位格雷码的顺序编码_yiduobo的每日leetcode 89.格雷编码的全部内容,希望文章能够帮你解决3位格雷码的顺序编码_yiduobo的每日leetcode 89.格雷编码所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(88)

评论列表共有 0 条评论

立即
投稿
返回
顶部