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 2n个0 0,…,0,2n个1 1,…,1,2n个1 1,…,1,2n个0 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 n−1位格雷码序列递推到 n n n位格雷码序列。
先把长为 2 n − 1 2^n-1 2n−1的格雷码序列翻转然后拼到原序列后面。
此时序列长度是 2 n 2^n 2n。
考虑衔接部分 和 首位部分。
我们对后一半的序列都加上 2 n − 1 2^n-1 2n−1 不会影响内部,此时衔接部分 和 首尾部分正好相差一位 ( 2 n − 1 ) (2^n-1) (2n−1)
时间复杂度: 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. 格雷编码(规律)的主要内容,如果未能解决你的问题,请参考以下文章