1. 程式人生 > 其它 >leetcode——格雷編碼

leetcode——格雷編碼

技術標籤:C++面試

題目:格雷編碼是一個二進位制數字系統,在該系統中,兩個連續的數值僅有一個位數的差異。

給定一個代表編碼總位數的非負整數n,列印其格雷編碼序列。即使有多個不同答案,你也只需要返回其中一種。格雷編碼序列必須以 0 開頭。

https://leetcode-cn.com/problems/gray-code

示例:

1、
輸入:2
輸出:[0,1,3,2]
解釋:
00 - 0
01 - 1
11 - 3
10 - 2

對於給定的n,其格雷編碼序列並不唯一。
例如,[0,2,3,1]也是一個有效的格雷編碼序列。

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

2、輸入:0
輸出:[0]
解釋: 我們定義格雷編碼序列必須以 0 開頭。
    給定編碼總位數為 n 的格雷編碼序列,其長度為 2n。當 n = 0 時,長度為 20 = 1。
    因此,當 n = 0 時,其格雷編碼序列為 [0]。

方案:映象反射法

思路:設 n 階格雷碼集合為 G(n),則 G(n+1) 階格雷碼為:
給 G(n) 階格雷碼每個元素二進位制形式前面新增 0,得到 G'(n);
設 G(n)集合倒序(映象)為 R(n),給 R(n) 每個元素二進位制形式前面新增 1,得到 R'(n);
G(n+1) = G'(n) ∪ R'(n) 拼接兩個集合即可得到下一階格雷碼。
根據以上規律,可從 00 階格雷碼推導致任何階格雷碼。

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

時間複雜度O(2^n)

空間複雜度O(2^n)