携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第1天,点击查看活动详情
一、题目描述:
70. 爬楼梯 - 力扣(LeetCode) (leetcode-cn.com)
假设你正在爬楼梯。需要 n 阶你才能到达楼顶。
每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?
示例 1:
输入:n = 2
输出:2
解释:有两种方法可以爬到楼顶。
1. 1 阶 + 1 阶```
2. 2 阶
示例 2:
输入:n = 3
输出:3
解释:有三种方法可以爬到楼顶。
1. 1 阶 + 1 阶 + 1 阶
2. 1 阶 + 2 阶
3. 2 阶 + 1 阶
提示:
- 1 <= n <= 45
二、思路分析:
参照官方动态规划
思路和算法
我们用 f(x) 表示爬到第 x 级台阶的方案数,考虑最后一步可能跨了一级台阶,也可能跨了两级台阶,所以我们可以列出如下式子:
f(x) = f(x - 1) + f(x - 2)
它意味着爬到第 x 级台阶的方案数是爬到第 x−1 级台阶的方案数和爬到第 x−2 级台阶的方案数的和;
以上是动态规划的转移方程,下面我们来讨论边界条件:
我们是从第 0 级开始爬的
所以从第 0 级爬到第 0 级我们可以看作只有一种方案
即 f(0)=1
从第 0 级到第 1 级也只有一种方案
即爬一级,f(1)=1
这两个作为边界条件就可以继续向后推导出第 n 级的正确结果
复杂度分析
我们不难通过转移方程和边界条件给出一个时间复杂度和空间复杂度都是 O(n) 的实现,但是由于这里的 f(x) 只和 f(x−1) 与 f(x−2) 有关
所以我们可以用「滚动数组思想」把空间复杂度优化成 O(1);
三、AC 代码:
int climbStairs(int n){
int sum = 1, i, a = 0, b = 0;
if(n == 0 || n == 1)
return 1;
for(i = 1; i <= n; i++){
a = b;
b = sum;
sum = a + b;
}
return sum;
}
四、总结:
也可以看做递归吧,就是这个函数简单,直接循环了
范文参考: