###89. Gray Code
题目: https://leetcode.com/problems/gray-code/
难度: Medium
思路:
首先不是从任何一个数开始都是有效的,所以naive的想法是从任何一个开始,然后如果能到2^n位,那么说明是有效的,问题解决.
A gray code sequence must begin with 0. ->简化了一点
先写了一段代码:
def nextCode(curCode, res, n):
if curCode not in res:
res.append(curCode)
else:
return
if len(res) == pow(2,n):
return res
for i in range(n):
nCode = curCode[:]
nCode[i] = 1 if curCode[i] == 0 else 0
nextCode(nCode,res,n)
res = []
nextCode([0,0,0],res,3)
print res
#[[0, 0, 0], [1, 0, 0], [1, 1, 0], [0, 1, 0], [0, 1, 1], [1, 1, 1], [1, 0, 1], [0, 0, 1]]
实际上问题是这段代码的时间复杂度感觉很高,但是试试
不失所望,到11就超时
class Solution(object):
def grayCode(self, n):
"""
:type n: int
:rtype: List[int]
"""
def nextCode(curCode, res, n):
if curCode not in res:
res.append(curCode)
else:
return
if len(res) == pow(2,n):
return res
for i in xrange(n):
nCode = curCode[:]
nCode[i] = 1 if curCode[i] == 0 else 0
nextCode(nCode, res, n)
def listoVal(curCode,n):
val = 0
for i in range(n-1,-1,-1):
val += pow(2,i) * curCode[i]
return val
res = []
nextCode([0]*n, res, n)
# print res
val = []
for i in res:
val.append(listoVal(i,n))
return val
然后居然有这个东西: Gray code,要用位运算!瞑目
https://en.wikipedia.org/wiki/Gray_code
服气,这个待研究
class Solution(object):
def grayCode(self, n):
"""
:type n: int
:rtype: List[int]
"""
result = [(i>>1)^i for i in range(pow(2,n))]
return results