https://leetcode-cn.com/probl...
我自己写的是第一种方法,又总结了题解中看到的两种方法
搜索
class Solution:
def grayCode(self, n: int) -> List[int]:
f = [False] * (2 ** n)
f[0] = True
r = [0]
def dfs(x):
if len(r) == 2 ** n: return
cur = 1
for i in range(n):
if x & cur:
if not f[x-cur]:
f[x-cur] = True
r.append(x-cur)
dfs(x-cur)
return
else:
if not f[x|cur]:
f[x|cur] = True
r.append(x|cur)
dfs(x|cur)
return
cur <<= 1
dfs(0)
return r
镜像法
出自题解 https://leetcode-cn.com/probl...
n + 1 的答案是 n 的答案复制两份,一上一下拼起来,上面的最高位补 0 (实际上就是不变)下面最高为补 1,并倒序。
class Solution:
def grayCode(self, n: int) -> List[int]:
if n == 0:
return [0]
if n == 1:
return [0, 1]
r = self.grayCode(n-1)
return r + [r[i] + (1<<n-1) for i in range(len(r)-1,-1,-1)]
公式法
这个就更强了,方法出自 https://leetcode-cn.com/probl...
直接根据公式算出来了:
gray_code\[i\] = (i >> 1) ^ i
class Solution:
def grayCode(self, n: int) -> List[int]:
return [(i>>1)^i for i in range(2**n)]
欢迎来我的博客: https://codeplot.top/
我的博客刷题分类:https://codeplot.top/categories/%E5%88%B7%E9%A2%98/
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。