持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第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
二、思路分析:
看了很多评论,有说是斐波那契数列,也有说是动态规划的经典题。
由于个人数学不好,所以直接用官方推荐的:动态规划
- 动态规划推导之前,可以先自行倒推一下,假设当前位于第 n 阶,那么上一步可能在第 n-1 或者第 n-2 阶,分别需要爬 1 级台阶和 2 级台阶。因此无论在哪一阶,都是只需要求出上一步的爬法即可。比如:
- f(0) = 1
- f(1) = 1
- f(2) = 2 = f(0) + f(1)
- f(3) = 3 = f(1) + f(2)
- f(4) = 5 = f(2) + f(3)
- f(5) = 8 = f(3) + f(4)
- 可以自行推导一下【其实就是斐波那契数列】,所以官方的公式就为:f(x) = f(x−2) + f(x−1),官方也说明,由于每次都只能爬1阶或者2阶,所以才只需推导x-1,和x-2即可。
- 因此,for循环,设置3个指针,第一个指向 f(x-2),第二个指向 f(x-1),最后一个是当前,循环n次。
三、AC 代码:
class Solution {
public int climbStairs(int n) {
int p=0,q=0,r=1;
for(int i=1;i<n;i++){
p = q;
q = r;
r = p+q;
}
return r;
}
}
范文参考: