力扣算法題—070爬樓梯

假設你正在爬樓梯。須要 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 }
相關文章
相關標籤/搜索