leetcode上的原题,地址https://leetcode.com/problems/gray-code/
先写几个看看:
n=1, 返回[0,1];
n=2,返回[0,1,3,2];
n=3,返回[0,1,3,2,6,7,5,4];
由上可以看出:
A(n+1) = A(n) + reverse(A(n))+2^(n+1);
如:
[0,1,3,2]=[0,1,2+1,2+0];
[0,1,3,2,6,7,5,4]=[0,1,3,2,4+2,4+3,4+1,4+0];
如何证明这个规律正确呢?
假设A(n)满足Gray Code,reverse(A(n))(逆序的A(n))的每一个元素都加上2^(n+1),实际上是使f(n)的每一个元素的2进制数的第(n+1)位由0变为1。显然reverse(A(n))+2^(n+1)也是满足Gray Code.而前后两半部分相连接的两个元素也仅仅是最高位取反而已,所以整个满足Gray Code.
代码如下:
vector<int> grayCode(int n) {
vector<int> ret;
ret.push_back(0);
for(int i=0;i<n;++i)
{
int len = ret.size();
int z = 1<<i;
for(int j =len-1;j>=0;--j)
{
ret.push_back(ret[j]+z);
}
}
return ret;
}