LeetCode 70. 爬楼梯
摘要
LeetCode 70 爬楼梯题解,使用动态规划法,每级台阶的走法数等于前两级台阶走法数之和,时间复杂度 O(n),空间复杂度 O(n)。
标签
#算法 #LeetCode #动态规划 #题解
目录
- 题目描述
- 易错点
- 思路
- 编写代码
1. 题目描述
假设你正在爬楼梯。需要 n 阶你才能到达楼顶。
每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?
示例 1:
text
输入:n = 2
输出:2
解释:有两种方法可以爬到楼顶。
1. 1 阶 + 1 阶
2. 2 阶
示例 2:
text
输入:n = 3
输出:3
解释:有三种方法可以爬到楼顶。
1. 1 阶 + 1 阶 + 1 阶
2. 1 阶 + 2 阶
3. 2 阶 + 1 阶
提示:
1 <= n <= 45
2. 易错点
- 当
n == 1时,只有 1 种方法,需要单独处理 - 当
n == 2时,有 2 种方法,需要单独处理 - 动态规划数组长度为
n + 1,索引从 0 开始,需确保访问不越界 - 循环从 3 开始计算,直到
n,需要正确初始化floor[1]和floor[2] - 返回值为
floor[n],而不是floor[n-1]
3. 思路
采用动态规划法解决爬楼梯问题:
- 到达第
n级台阶,可以从第n-1级爬 1 步到达,也可以从第n-2级爬 2 步到达 - 因此状态转移方程为:
dp[n] = dp[n-1] + dp[n-2] - 初始条件:
dp[1] = 1(1 级台阶 1 种方法),dp[2] = 2(2 级台阶 2 种方法) - 从第 3 级开始递推,直到计算出
dp[n] - 返回
dp[n]即为最终答案
该问题本质上是斐波那契数列的应用,时间复杂度 O(n),空间复杂度 O(n)。
4. 编写代码
c 运行
c
int climbStairs(int n) {
if(n == 1)
return 1;
if(n == 2)
return 2;
int * floor = (int*)malloc((n+1)*sizeof(int));
floor[1] = 1;
floor[2] = 2;
int now = 1;
while(now <= n) {
if(now >= 3) {
floor[now] = floor[now-1] + floor[now-2];
}
now++;
}
return floor[n];
}