格雷码

89. 格雷编码

题目描述

格雷编码是一个二进制数字系统,在该系统中,两个连续的数值仅有一个位数的差异。

给定一个代表编码总位数的非负整数 n,打印其格雷编码序列。即使有多个不同答案,你也只需要返回其中一种。

格雷编码序列必须以 0 开头

示例

输入: 2

输出: [0,1,3,2]

说明:

对于给定的 n,其格雷编码序列并不唯一。
例如,[0,2,3,1] 也是一个有效的格雷编码序列

思路krahets

  • \(n\) 阶格雷码集合为\(G(n)\),则 \(G(n+1)\) 阶格雷码为:
    • \(G(n)\)阶格雷码每个元素二进制形式前面添加 0,得到\(G'(n)\)
    • \(G(n)\)集合倒叙为\(R(n)\),给\(R(n)\)每个元素二进制形式前面添加 1,得到\(R'(n)\)
    • \(G(n+1)=G'(n)\bigcup R'(n)\)拼接两个集合即可得到下一阶格雷码

img

img

img

img

代码

class Solution {
public:
    vector<int> grayCode(int n) {
        vector<vector<int>>dp(n+1);
        dp[0].resize(1);
        dp[0][0]=0;
        if(n==0)
            return {0};
        for(int i=1;i<=n;i++)
        {
            for(auto elem:dp[i-1])
                dp[i].push_back(elem);
            for(int j=dp[i-1].size()-1;j>=0;--j)
                dp[i].push_back(dp[i-1][j]+pow(2,i-1));
        }
        return dp[n];
    }
};
posted @ 2020-09-16 15:26  周颖  阅读(88)  评论(0)    收藏  举报