这是我参与更文挑战的第14天,活动详情查看: 更文挑战
题目描述
爬楼梯
假设你正在爬楼梯。需要 n 阶你才能到达楼顶。
每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?
注意:给定 n 是一个正整数
leetcode-cn.com/problems/cl…
// 示例1
输入: 2
输出: 2
解释: 有两种方法可以爬到楼顶。
1. 1 阶 + 1 阶
2. 2 阶
// 示例2
输入: 3
输出: 3
解释: 有三种方法可以爬到楼顶。
1. 1 阶 + 1 阶 + 1 阶
2. 1 阶 + 2 阶
3. 2 阶 + 1 阶
标签
动态规划
解题分析
1. 动态规划
老经典题目了,就写个最简单的方法。
已知我们从平地上开始走台阶,所以我们是从0开始的。
由于腿短,我们只有两种方法来爬楼梯。
1. 走1阶
2. 走2阶
开始爬起来
走到第1阶台阶,我们只能选第一个方法,走一阶楼梯。
走到第2阶台阶,我们有两种方法,走两阶1阶台阶或者直接走2阶台阶。
走到第3阶台阶,我们有三种方法,1+1+1 或者 1+2 或者 2 + 1
走到第4阶台阶,我们有五种方法, 1+1+1+1, 1+1+2, 1+2+1, 2+1+1, 2+2。
.....
有没有发现规律,走到第n阶台阶时,我们回退一下,是不是只有两种方式能走到第n阶台阶。
1. 第n-1台阶 走到第n阶台阶
2. 第n-2台阶 走到第n阶台阶
他们两个的方案数,相加也就等于第n阶总方案数。
f(n)=f(n−1)+f(n−2)
从第1阶台阶我们看看
1: 0 + 1 = 1
2: 1 + 1 = 2
3: 2 + 1 = 3
4: 3 + 2 = 5
这特么不是斐波那契数列么。
0 1 1 2 3 5 8 13 21.....
数列从第3项开始,每一项都等于前两项之和。
知道这个原理,写代码就简单了。
来人上代码!!!!!
function climbStairs(n: number): number {
let stepOne = 0, stepTwo = 0, result = 1
for(let i =1; i<=n; i++) {
stepOne = stepTwo
stepTwo = result
result = stepOne + stepTwo
}
return result
};
还有另外一种更直接的表达方式,维护一个斐波那契数列数组。
function climbStairs(n: number): number {
const dp: number[] = []
dp[0] = 1
dp[1] = 1
for(let i =2; i<=n; i++) {
dp[i] = dp[i -1] + dp[i-2]
}
return dp[n]
};
最后
从今天开始不鸽,每天一道算法题并发布文章,首先想要解决的题组为Top100
,第六道题目打完收工!!