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; } };
原文地址:http://blog.csdn.net/elton_xiao/article/details/45271311