- SignalDesk5 hr ago
如图 实际上大部分的时间都是在尝试看懂题目和思考思路,想通之后,代码十分钟就写完了。 这里很明显,t位格雷码序列就是t位二进制数的所有可能表示。问题在于如何放置这些二进制数。在逐个生成这个思路碰壁一段时间后,自然想到了递归调用和数学归纳法。于是有了下面的思路: 假设我们已经有了一个t位的格雷码序列l(方便起见,我们将其中的每一个数视作二进制表示)。为了获得t + 1位的格雷码序列,我们只需要: 将l这个列表进行反转,得到l’ = l[::-1] 对于l中的每一个数,在最前面加一个0. 对于l’中的每一个数,在最前面加上一个1. 将l 和l’合并,得到res= l + l’ 简要的证明: res的前半部分,后半部分内部,相邻两个数的第一位相同,除去第一位的后缀只有一位不同(由t位格雷码的性质得到)。于是res的前半部分,后半部分内部,相邻两个数只有一位不同。 前半部分的最后一个数,和后半部分的第一个数。这两个数也是相邻的。由于后半部分的后缀(除去第一位)是由前半部分的后缀反转得到的。所以这两个数的后缀相同。只有第一位不同。 res的第一个数和最后一个数和上面同理,只有第一位不同。 上面构成的所有数依旧是t +1位的二进制数,所以在范围 [0, 2^{t+1} - 1] 内。 前半部分和后半部分之间没有重复(第一位不同)。由于每个半部分的内部是由t位格雷码构造成的,所以内部也没有重复。于是res没有重复。 第一个数依旧是0。 原序列共有 2^t 个数,res有 2^{t+1} 个数 对应的代码如下: class Solution: def grayCode(self, n: int) -> list[int]: def getBinNum(n): if n == 1: return ['0', '1'] subTree = getBinNum(n - 1) asubTree = subTree[:: -1] pre = ['0' + binNum for binNum in subTree] post = ['1' + binNum for binNum in asubTree] res = pre + post return res def binToDe(num): l = len(num) res = 0 for i in range(l): tmp = int(num[l - i - 1]) * (2**i) res += tmp return res binnums = getBinNum(n) return [binToDe(binnum) for binnum in binnums] 与gpt大人交流后,发现可以直接操作整数来优化时间。 5 个帖子 - 2 位参与者 阅读完整话题
- 情报分类:技术学习与提效
- 分类依据:内容涉及技术、AI、软件工具或工程实践
- 信息来源:服务器 / LINUX DO - 最新话题
- 发布时间:2026/10/5 22:18:15
- No replies yet