每日刷題 格雷編碼

2021-09-27 12:38:43 字數 1490 閱讀 4408

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

給定乙個代表編碼總位數的非負整數 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

例 2:

輸入: 0

輸出: [0]

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

這道題花費了一下午的時間,不過總算得出乙個線性時間的演算法:差值法

首先看 n = 0,1,2,3 的情況:

從上圖,我們可以看到,不同的 n 之間的元素是存在一定繼承關係的。

對於 n = 3 那一行,相鄰元素之間的差值為:

我們可以發現如下規律:

n 值變化處(即紅線劃開的區域),會發生乙個 2 的指數的提公升(即綠色圓圈標記的差值)。

n 值變化處兩側,差值呈互為負數關係,例如 圓圈 2 處兩側,分別為 (1, -1); 圓圈 4 兩側,分別為 (-1, 1), (2,-2),(1,-1).

再結合下標之間的關係,**自然也就清晰了。

**:

class

solution

;//當 n = 0 時候;

for(

int i =

1, base =

1, count =

2; i <

pow(

2,n)

; i++)if

( i == base)

res.

push_back

( res.

back()

+ base)

, base<<=

1, count =2;

else

res.

push_back

( res[i -1]

-(res[ i - count]

- res[ i - count -1]

)), count +=2

;return res;}}

;

當然,還有映象法、公式法等。

leetcode刷題 89格雷編碼

格雷編碼是乙個二進位制數字系統,在該系統中,兩個連續的數值僅有乙個位數的差異。給定乙個代表編碼總位數的非負整數 n,列印其格雷編碼序列。即使有多個不同答案,你也只需要返回其中一種。格雷編碼序列必須以 0 開頭。示例 1 輸入 2 輸出 0,1,3,2 解釋 00 0 01 1 11 3 10 2 對...

89 格雷編碼

格雷編碼是乙個二進位制數字系統,在該系統中,兩個連續的數值僅有乙個位數的差異。給定乙個代表編碼總位數的非負整數 n,列印其格雷編碼序列。格雷編碼序列必須以 0 開頭。示例 1 輸入 2 輸出 0,1,3,2 解釋 00 0 01 1 11 3 10 2 對於給定的 n,其格雷編碼序列並不唯一。例如,...

leetcode 格雷編碼

題目 格雷編碼是乙個二進位制數字系統,在該系統中,兩個連續的數值僅有乙個位數的差異。給定乙個代表編碼總位數的非負整數 n,列印其格雷編碼序列。格雷編碼序列必須以 0 開頭。輸入 2 輸出 0,1,3,2 解釋 00 0 01 1 11 3 10 2 對於給定的 n,其格雷編碼序列並不唯一。例如,0,...