LC.89. 格雷编码(规律)

Posted Harris-H

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LC.89. 格雷编码(规律)相关的知识,希望对你有一定的参考价值。

LC.89. 格雷编码(规律)

方法1

可以发现第 i i i位的规律是

0 , … , 0 ⏟ 2 n 个 0 , 1 , … , 1 ⏟ 2 n 个 1 , 1 , … , 1 ⏟ 2 n 个 1 , 0 , … , 0 ⏟ 2 n 个 0 \\underbrace0,\\dots,0_2^n个0,\\underbrace1,\\dots,1_2^n个1,\\underbrace1,\\dots,1_2^n个1,\\underbrace0,\\dots,0_2^n个0 2n0 0,,0,2n1 1,,1,2n1 1,,1,2n0 0,,0

时间复杂度: O ( 2 n × n ) O(2^n\\times n ) O(2n×n)

class Solution 
public:
    vector<int> grayCode(int n) 
        int m = 1<<n;
        vector<int>a(m);
        for(int j=0;j<n;j++)
            int x = (1<<j)*4;
            int val = 1<<j;
            int l = 1<<j;
            int r = l*3;
        for(int i=0;i<m;i++)
            int v = i%x;
            a[i] += val*(v>=l && v<r);
        
        
        return a;
    
;

方法2

递推,由 n − 1 n-1 n1位格雷码序列递推到 n n n位格雷码序列。

先把长为 2 n − 1 2^n-1 2n1的格雷码序列翻转然后拼到原序列后面。

此时序列长度是 2 n 2^n 2n

考虑衔接部分 和 首位部分。

我们对后一半的序列都加上 2 n − 1 2^n-1 2n1 不会影响内部,此时衔接部分 和 首尾部分正好相差一位 ( 2 n − 1 ) (2^n-1) (2n1)

时间复杂度: O ( 2 n ) O(2^n) O(2n)

class Solution 
public:
    vector<int> grayCode(int n) 
        vector<int> ret;
        ret.reserve(1 << n);
        ret.push_back(0);
        for (int i = 1; i <= n; i++) 
            int m = ret.size();
            for (int j = m - 1; j >= 0; j--) 
                ret.push_back(ret[j] | (1 << (i - 1)));
            
        
        return ret;
    
;

以上是关于LC.89. 格雷编码(规律)的主要内容,如果未能解决你的问题,请参考以下文章

vivado 怎样设置参数让编码状态为格雷码或是独热码

leetcode 每日一题 89. 格雷编码

LeetCode 格雷码序列的生成

89-格雷编码

Leetcode 89.格雷编码

089 Gray Code 格雷编码