题目:
假设你正在爬楼梯。需要 n 阶你才能到达楼顶。
每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?
注意:给定 n 是一个正整数。
示例 1:
输入: 2
输出: 2
解释: 有两种方法可以爬到楼顶。
1. 1 阶 + 1 阶
2. 2 阶
示例 2:
输入: 3
输出: 3
解释: 有三种方法可以爬到楼顶。
1. 1 阶 + 1 阶 + 1 阶
2. 1 阶 + 2 阶
3. 2 阶 + 1 阶
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/climbing-stairs
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
递归:
这个显而易见可以用递归来处理.到达当前台阶n的需要次数是n-1和n-2次。如果只有一级台阶就返回1,如果只有两级台阶就返回2.
代码:
class Solution {
public:
int climbStairs(int n) {
if (n == 1)
{
return 1;
}
if (n == 2)
{
return 2;
}
return climbStairs(n-1)+climbStairs(n-2);
}
};
时间复杂度:O(2^n)
空间复杂度:O(n)
动态规划:
递归会超时,那我们能不能用动态规划来处理这个问题。可以注意到知道当前台阶数只需要一级前和两级前。同时我们也知道第一级的答案是1,第二级的答案是2。我们可以建立一个数组res保存从1-n的台阶数,循环3-n次并更新数组里对应的值,最后返回res[n]即可。
代码:
class Solution {
public:
int climbStairs(int n) {
if (n <= 1)
{
return 1;
}
int res[n+1];
res[1] = 1;
res[2] = 2;
for (int i=3;i<=n;i++)
{
res[i] = res[i-1]+res[i-2];
}
return res[n];
}
};
时间复杂度:O(n)
空间复杂度:O(n)
空间优化的动态规划(滚动数组):
我们可以对这个进行空间优化,我们只需要记住前一级需要的次数和前二级需要的次数就可以得到当前需要的次数。更新时也要更新前一级和前二级。
代码:
class Solution {
public:
int climbStairs(int n) {
if (n==1)
{
return 1;
}
if(n==2)
{
return 2;
}
int first = 1;
int second = 2;
int res =0;
for (int i = 3; i<=n;i++)
{
res = first+second;
first = second;
second = res;
}
return second;
}
};
时间复杂度:O(n)
空间复杂度:O(1)
参考:
https://leetcode-cn.com/problems/climbing-stairs/solution/pa-lou-ti-by-leetcode-solution/