The gray code is a binary numeral system where two successive values differ in only one bit.
Given a non-negative integer n representing the total number of bits in the code, print the sequence of gray code. A gray code sequence must begin with 0.
For example, given n = 2, return [0,1,3,2]
. Its gray code sequence is:
00 - 0 01 - 1 11 - 3 10 - 2
Note:
For a given n, a gray code sequence is not uniquely defined.
For example, [0,2,3,1]
is also a valid gray code sequence according to the above definition.
For now, the judge is able to judge based on one instance of gray code sequence. Sorry about that.
算法一,逆序添加
000 - 0 001 - 1 011 - 3 010 - 2 110 - 3 111 - 4 101 - 5 100 - 7规律是,最左面的那一位,前面一部,全是0,后面一半,全是1。
而其余位,后一半,是前一半的逆序。
知道了n-1位排列,在求n位排列时,可以把已有排列,前面全部添0,得到前一半; 然后,前面添1,倒序排列,得到另一半。
而整数,前面添0,其实还是他本身。即n-1位的排列,就是n位的前半部分。 无需要作任何操作。
只需要作后而逆序添加即可。
在leetcode上实际执行时间为6ms。
class Solution {
public:
vector<int> grayCode(int n) {
vector<int> ans;
ans.reserve(1 << n);
ans.push_back(0);
for (int i=0; i<n; i++) {
int size = ans.size();
while (size) {
ans.push_back(1 << i | ans[--size]);
}
}
return ans;
}
};
算法二,公式
Gray code,在维基上,有专题,参见
http://en.wikipedia.org/wiki/Gray_code
对于整数转换成对应的格雷码,是有公式的
unsigned int binaryToGray(unsigned int num) { return (num >> 1) ^ num; }
class Solution {
public:
vector<int> grayCode(int n) {
vector<int> ans;
ans.reserve(1 << n);
for (int i=0; i<1<<n; i++) {
ans.push_back(i>>1 ^ i);
}
return ans;
}
};