格雷編碼是乙個二進位制數字系統,在該系統中,兩個連續的數值僅有乙個位數的差異。
給定乙個代表編碼總位數的非負整數 n,列印其格雷編碼序列。格雷編碼序列必須以 0 開頭。
示例 1:
輸入:
2輸出:[0
,1,3
,2]解釋:00-
001-1
11-310
-2
對於給定的 n,其格雷編碼序列並不唯一。
例如,[0,2,3,1] 也是乙個有效的格雷編碼序列。
00-0
10-211
-301-
1
示例 2:
輸入:
0輸出:[0
]解釋: 我們定義格雷編碼序列必須以 0 開頭。
給定編碼總位數為 n 的格雷編碼序列,其長度為 2n。當 n =
0 時,長度為 20=1。
因此,當 n =
0 時,其格雷編碼序列為 [
0]。
假設我們要求n=3時的格雷編碼。
已知n=2時,格雷編碼的二進位制位a = [000, 001, 011, 010],我們將a翻轉後得到b = [010, 011, 001, 000]。
不難看出,a是n=2時的格雷編碼,因此a滿足格雷編碼的條件,即相鄰的數字之間的二進位制僅有一位不同。另一方面,b是a翻轉之後得到的,因此b也滿足格雷編碼的條件。且a的最後乙個元素與b的第乙個元素相同。
因此,為了使b的第乙個元素和a的最後乙個元素之間滿足格雷編碼的要求,只要讓b的某一位變動即可(0->1 or 1->0)。但是如果b的第乙個元素發生改變,可能會打亂b中的格雷編碼。為了在b的第乙個元素發生改變時,b中的所有元素仍然滿足格雷編碼條件,應該找到b中所有元素均相同的一位,改變該位置上的數字即可。因此,應該變動b的最高位,
即b變為[110, 111, 101, 100]。
總結上述規律可以發現,當我們有了n=m-1的格雷編碼結果a時,將a逆轉得到b,且b中所有元素在從右往左數的第m位均相同(0),因此下一次變動時,僅改變b中每個數字的第m位即可。
class
solution
; vector<
int> res;
rec.
push_back(0
);int curnum =1;
while
(n >0)
return res;}}
;
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,其格雷編碼序列並不唯一。例如,...
leetcode 89 格雷編碼
格雷編碼是乙個二進位制數字系統,在該系統中,兩個連續的數值僅有乙個位數的差異。給定乙個代表編碼總位數的非負整數 n,列印其格雷編碼序列。格雷編碼序列必須以 0 開頭。示例1 輸入 2 輸出 0,1,3,2 解釋 00 0 01 1 11 3 10 2 對於給定的 n,其格雷編碼序列並不唯一。例如,0...