格雷編碼是乙個二進位制數字系統,在該系統中,兩個連續的數值僅有乙個位數的差異。
給定乙個代表編碼總位數的非負整數 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,...