LeetCode89 格雷編碼

2021-09-19 16:08:42 字數 1543 閱讀 7945

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

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

n2^n

2n。當 n = 0 時,長度為 2

02^0

20= 1。

因此,當 n = 0 時,其格雷編碼序列為 [0]。

考慮格雷碼的生成方式:

首先乙個長度為n的格雷碼,其一共有多少個?

每一位可以是0也可以是1,因此有2

n2^n

2n個長度為n-1的格雷碼有2n−

12^2n−1

個,其數量恰好是長度為n的格雷碼的一半

於是我們考慮,通過在長度為n-1的格雷碼的基礎上,進行操作以得到長度為n的格雷碼的數量

由於長度只相差一位,因此我們要做的就是在某處填充這一位,所選位置有無要求呢?

我們知道格雷碼相鄰之間只差一位,因此全部填充相同的數字0時,還能保持格雷碼的性質,但是第二次填充1時,就不能保持該性質了,可以看看下面的例子:

00

0111

10第一位之前新增0:

000001

011010

第一位之前新增1:

100101

111110

但是倒過來就能解決這個問題:

00

0111

10第一位之前新增0:

000001

011010

第一位之前新增1:

110111

101100

因此,利用這個性質,可以快速計算出結果

首位加1,等價於加2n−

12^2n−1

首位加0,數值不變

c++**:

class solution ;

if (n <= 0)

return nums;

for (int i = 1; i <= n; i++)

} return nums;

}};

執行效率:

Leetcode 89 格雷編碼

格雷編碼是乙個二進位制數字系統,在該系統中,兩個連續的數值僅有乙個位數的差異。給定乙個代表編碼總位數的非負整數n,列印其格雷編碼序列。格雷編碼序列必須以 0 開頭。示例 1 輸入 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...

LeetCode 89格雷編碼

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