回溯 leetcode 格雷編碼

2021-10-25 21:11:32 字數 1322 閱讀 2222

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

給定乙個代表編碼總位數的非負整數 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,其格雷編碼序列並不唯一。例如,...