假設你正在爬樓梯。須要 n 階你才能到達樓頂。函數
每次你能夠爬 1 或 2 個臺階。你有多少種不一樣的方法能夠爬到樓頂呢?優化
注意:給定 n 是一個正整數。spa
示例 1:code
輸入: 2 輸出: 2 解釋: 有兩種方法能夠爬到樓頂。 1. 1 階 + 1 階 2. 2 階
示例 2:blog
輸入: 3 輸出: 3 解釋: 有三種方法能夠爬到樓頂。 1. 1 階 + 1 階 + 1 階 2. 1 階 + 2 階 3. 2 階 + 1 階
1 #include "_000庫函數.h" 2 //感受有好多種爬法 3 //我又想到了用全排列 4 //又是超時,一用到全排列就超時 5 class Solution { 6 public: 7 int climbStairs(int n) { 8 vector<int>v(n, 1);//開始使用一節一節的爬法 9 int res = 1; 10 int num1 = n, num2 = 0;//一節與二節的數量 11 while (1) { 12 sort(v.begin(), v.end()); 13 while (next_permutation(v.begin(), v.end())) ++res; 14 v.clear(); 15 num1 -= 2; 16 if (num1 < 0)break; 17 ++num2;//兩個一節用一個二節代替 18 v.insert(v.end(), num1, 1); 19 v.insert(v.end(), num2, 2); 20 ++res; 21 } 22 return res; 23 } 24 }; 25 26 27 //使用動態規劃思想 28 class Solution { 29 public: 30 int climbStairs(int n) { 31 if (n <= 1) return 1; 32 vector<int> dp(n); 33 dp[0] = 1; dp[1] = 2; 34 for (int i = 2; i < n; ++i) { 35 dp[i] = dp[i - 1] + dp[i - 2]; 36 } 37 return dp.back(); 38 } 39 }; 40 41 42 //優化點的代碼 43 class Solution { 44 public: 45 int climbStairs(int n) { 46 int a = 1, b = 1; 47 while (n--) { 48 b += a; 49 a = b - a; 50 } 51 return a; 52 } 53 }; 54 void T070() { 55 Solution s; 56 cout << "1: " << s.climbStairs(1) << endl; 57 cout << "2: " << s.climbStairs(2) << endl; 58 cout << "3: " << s.climbStairs(3) << endl; 59 cout << "5: " << s.climbStairs(5) << endl; 60 }