微軟面試題: LeetCode 89. 格雷編碼 middle 出現次數:2

題目描述:css

89. 格雷編碼 難度 中等

動態規劃:編碼

按照動態規劃或者說遞歸的思路去想,也就是解決了小問題,怎麼解決大問題。spa

咱們假設咱們有了 n = 2 的解,而後考慮怎麼獲得 n = 3 的解。code

n = 2 的解 blog

00 - 0遞歸

10 - 2leetcode

11 - 3get

01 - 1it

若是再增長一位,無非是在最高位增長 0 或者 1,考慮先增長 0。io

n = 3 的解,最高位是 0

000 - 0

010 - 2

011 - 3

001 - 1

因爲加的是 0,其實數值並無變化,依然符合格雷編碼的規則。

再考慮增長 1,在 n = 2 的解基礎上在最高位把 1 丟過去?

  n = 3 的解,在n = 2 的解 最高位加 0 獲得

000 - 0
010 - 2
011 - 3
001 - 1

n = 3 的解,在n = 2  的解最高位加 1 獲得 --------新增
100 - 4
110 - 6
111 - 7
101 - 5

第 4 行 001 和新增的第 5 行 100,有 3 個 bit 位不一樣了,不符合格雷編碼規則。

能夠在加 0 以後 ,改變一下 加 1 的順序,第五行 將第四行的最高位從 0 變成 1,

其他不變,第六行 將第 3行的最高位從 0 變爲 1,其他不變。依次類推。

如今成功根據 n = 2 的解 推出 n = 3 的解了,問題解決。

 1 class Solution {
 2 public:
 3     vector<int> grayCode(int n)
 4     {
 5           vector<int> res;
 6           res.push_back(0);
 7           if(n == 0) return res;
 8           res.push_back(1);
 9           if(n == 1) return res;
10           for(int i = 2;i <= n;++i)
11           {
12               int tmp_len = res.size();
13               for(int j = tmp_len - 1; j >= 0; --j)
14               {
15                   int add = 1 << i-1;//用移位操做更快
16                   // int add = power(2,i-1);
17                   res.push_back(res[j] + add);
18               }
19           }
20           return res;
21     }
22 };
相關文章
相關標籤/搜索