格雷編碼是乙個二進位制數字系統,在該系統中,兩個連續的數值僅有乙個位數的差異。
給定乙個代表編碼總位數的非負整數 n,列印其格雷編碼序列。即使有多個不同答案,你也只需要返回其中一種。
格雷編碼序列必須以 0 開頭。
示例 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
89. 格雷編碼
定義乙個path儲存中間結果,一旦滿足條件立即輸出。
當前數字假如為000,它下乙個格雷編碼可以是001,010,100。著重說一下**中的gray函式,修改第p位並返回:先判斷第p位數字是0或1,如果0,或操作可修改為1;如果是1,與操作可修改為0。
class solution
int pre = path[path.size() - 1]; // 結果列表中最後乙個數字
for (int i = 0; i < n; i++) }}
int gray(int v, int p) else }};
將回溯**提交發現,執行效率很低:執行用時:20 ms, 在所有 c++ 提交中擊敗了12.37%的使用者。
好奇的我去看了題解,發現本題還是有規律可循的,沒寫**,我把發現的規律列在下面:
當n=1時,結果是[0,1],
當n=2時,分3步:
將n=1的結果拿過來得到[0,1]。
將[0,1]照一下鏡子複製乙份得到[1,0],二者合併得[0,1 | 1, 0],中間加了乙個符號|,暫且稱它為鏡子。
鏡子左側每個數字開頭新增0,右側新增1,得[00, 01 | 11, 10],此即為結果
當n=3,4,5...時,依次重複上面3步。
當n=3時,
將n=2的結果拿過來得到[00, 01, 11, 10]。
將[00, 01, 11, 10]照一下鏡子複製乙份得到[10, 11, 01, 00],二者合併得[00, 01, 11, 10 | 10, 11, 01, 00]。
鏡子左側每個數字開頭新增0,右側新增1,得[000, 001, 011, 010 | 110, 111, 101, 100],此即為結果
leetcode 格雷編碼
題目 格雷編碼是乙個二進位制數字系統,在該系統中,兩個連續的數值僅有乙個位數的差異。給定乙個代表編碼總位數的非負整數 n,列印其格雷編碼序列。格雷編碼序列必須以 0 開頭。輸入 2 輸出 0,1,3,2 解釋 00 0 01 1 11 3 10 2 對於給定的 n,其格雷編碼序列並不唯一。例如,0,...
Leetcode 89 格雷編碼
格雷編碼是乙個二進位制數字系統,在該系統中,兩個連續的數值僅有乙個位數的差異。給定乙個代表編碼總位數的非負整數n,列印其格雷編碼序列。格雷編碼序列必須以 0 開頭。示例 1 輸入 2輸出 0,1,3,2 解釋 00 0 01 1 11 3 10 2 對於給定的 n,其格雷編碼序列並不唯一。例如,0,...
LeetCode89 格雷編碼
格雷編碼是乙個二進位制數字系統,在該系統中,兩個連續的數值僅有乙個位數的差異。給定乙個代表編碼總位數的非負整數 n,列印其格雷編碼序列。格雷編碼序列必須以 0 開頭。示例 1 輸入 2 輸出 0,1,3,2 解釋 00 0 01 1 11 3 10 2 對於給定的 n,其格雷編碼序列並不唯一。例如,...