[LeetCode] 89. Gray Code

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.

Example 1:

Input: 2
Output: [0,1,3,2]
Explanation:
00 - 0
01 - 1
11 - 3
10 - 2

For a given n, a gray code sequence may not be uniquely defined.
For example, [0,2,3,1] is also a valid gray code sequence.

00 - 0
10 - 2
11 - 3
01 - 1

Example 2:

Input: 0
Output: [0]
Explanation: We define the gray code sequence to begin with 0.
             A gray code sequence of n has size = 2n, which for n = 0 the size is 20 = 1.
             Therefore, for n = 0 the gray code sequence is [0].


题目要求写出相邻二进制码之间只有一位不同的二进制码序列,二进制码的长度为n。并且二进制码序列以0开头。

分析:一位二进制码是0 1
二位二进制码是00 01 10 11
三位二进制码是000 001 010 011 111 110 101 100
可以看出n+1位二进制码就是的后n位镜像对称,然后后边的2^n/2位在首位加上1即可。如下图所示:

因此使用递归法产生多位二进制码。首位的1相当于当前二进制码+1的二进制码无符号左移n-1位。

代码展示:

class Solution {
public:
    vector<int> grayCode(int n) {
        vector<int> res;
        if(n==0){
            res.push_back(0);
            return res;
        }
        vector<int> temp = grayCode(n-1);
        for(int i=0;i<temp.size();++i)res.push_back(temp[i]);
        for(int i=temp.size()-1;i>=0;--i)res.push_back(temp[i]+(1<<n-1));
        return res;
    }
};

原文地址:https://www.cnblogs.com/cff2121/p/10824478.html