力扣算法题—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 }
相关文章
相关标签/搜索