题目链接:
题目描述
思路
1 迭代-镜面反射
n=1
时,初始化为{0,1}
;下面以n=2
为例分析迭代过程:
(1)遍历数组,原数组每一元素左移一位,即所有元素最后一位加一个0;
(2)反向遍历原数组 for j in range(j-1,-1,-1)
,数组后添加 num[j]+1
;构建完的数组关于中心是镜面对称的 [00, 10, 11, 01]
类似下图,不过本人使用的是在最右边加0/1,图中是在最左边加0/1;
复杂度分析
时间复杂度:O(n2n)O(n2^n)O(n2n)
空间复杂度:O(1)O(1)O(1)
class Solution {
public:
vector<int> grayCode(int n) {
if (n == 0) return vector<int> {0};
vector<int> ret = {0,1};
for (int i = 2; i <= n; ++i) {
int len = ret.size();
for (int j = 0; j < len; ++j)
ret [j] = ret[j] << 1; // 末位加一个0
for (int j = len-1; j>=0 ; --j)
ret.push_back(ret[j]+1); // 末位加一个1
}
return ret;
}
};
2 格雷码公式
二进制数转格雷码
G(n)=B(n+1)xorB(n)G(n) = B(n+1) xor B(n)G(n)=B(n+1)xorB(n)
class Solution {
public:
vector<int> grayCode(int n) {
vector<int> ret(1<<n);
for (int i = 0; i< (1<<n); ++i)
ret[i] = i^(i >> 1);
return ret;
}
};