二进制的练习掌握
格雷编码是一个二进制数字系统,在该系统中,两个连续的数值仅有一个位数的差异。
要求:给一个n,构建对应的格雷编码
举例:
输入: 2
输出: [0,1,3,2]
解释:
00 - 0
01 - 1
11 - 3
10 - 2
思路:
观察案例得知,格雷编码是连续的二进制数。
规则有两条:
1,n=2,就是两位二进制,对应的那n=3就是三位二进制…以此类推。
2,仅有一位差异
, 00,下一个可以是01或者10,我们选择01,那下一位就是11,再下一位就是10
解题:
所以,思路来了,万能的动态规划,万物皆可动~~。
假设 dp[n-1] = [0,1] , 逆序就是[1,0] ,每个元素+2**n,就是[11,10]
dp[n] = dp[n-1] + (dp[n-1]的逆序,并对每个元素+2**n)
优化:
此处动态规划,发现只需要n项,和n-1项,之前的n-2…所有都不是必须的。
所以,我们用两个变量来代替dp
用来 circle 代替 n.(第一轮n=0,第二轮n=1,以此类推)
编码实现:
class Solution:
def grayCode(self, n: int) -> List[int]:
pre = [0] # 相当于dp[n-1]
circle = 0 # 目前到第几轮,也就是dp[n]中的n
now = [0] # 相当于dp[n]
while circle<n:
temp = []
size = len(pre)
for index in range(size-1,-1,-1):
temp.append(pre[index]+2**circle)
circle+=1
now = pre+temp
pre = now
return now