題目描述:css
動態規劃:編碼
按照動態規劃或者說遞歸的思路去想,也就是解決了小問題,怎麼解決大問題。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 };