leetcode——格雷編碼
阿新 • • 發佈:2021-01-21
題目:格雷編碼是一個二進位制數字系統,在該系統中,兩個連續的數值僅有一個位數的差異。
給定一個代表編碼總位數的非負整數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; } };
時間複雜度
空間複雜度