
编程最简单,但是要知道公式
格雷编码公式 G(i) = i ^ (i/2);
如 n = 3:
G(0) = 000,
G(1) = 1 ^ 0 = 001 ^ 000 = 001
G(2) = 2 ^ 1 = 010 ^ 001 = 011
G(3) = 3 ^ 1 = 011 ^ 001 = 010
G(4) = 4 ^ 2 = 100 ^ 010 = 110
G(5) = 5 ^ 2 = 101 ^ 010 = 111
G(6) = 6 ^ 3 = 110 ^ 011 = 101
G(7) = 7 ^ 3 = 111 ^ 011 = 100
vector<int> grayCode(int n) {
vector<int> res;
for(int i=0;i<(1<<n);++i)
res.push_back(i^(i>>1));
return res;
}
还有另一种推出来的公式
0 1 -> 00 10 11 01-> 000 100 110 010 011 111 101 001
在上一组里全部尾后补0再倒序全部补1->格雷编码
vector<int> grayCode(int n) {
if(n==0)
return{0};
vector<vector<int>> dp(n+1);
dp[0]={0};
dp[1]={0,1};
for(int i=2;i<=n;++i){
for(int j=0;j<(int)dp[i-1].size();++j)
dp[i].push_back(dp[i-1][j]<<1);
for(int j=dp[i-1].size()-1;j>=0;--j)
dp[i].push_back((dp[i-1][j]<<1)+1);
}
return dp[n];
}
476

被折叠的 条评论
为什么被折叠?



