【问题】
假设你正在爬楼梯。需要 n 阶你才能到达楼顶。
每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?
【要求】
示例 1:
输入: 2
输出: 2
解释: 有两种方法可以爬到楼顶。
1. 1 阶 + 1 阶
2. 2 阶
示例 2:
输入: 3
输出: 3
解释: 有三种方法可以爬到楼顶。
4. 1 阶 + 1 阶 + 1 阶
5. 1 阶 + 2 阶
6. 2 阶 + 1 阶
【解题思路】
- 要爬到楼梯的最上层,最后一步有两种走法,一种是一步一个阶梯,还有一种是 一步两个阶梯;
- 要爬上最后一步所到达的楼梯也有两种走法,一种是一步一个阶梯,还有一种是 一步两个阶梯;
- 所以依次递归下去,归到不能够归,就是在第三层阶梯的时候有几种走法
所以当阶梯数为 0 的时候 有0种走法,即dp[0] =0
当阶梯数为1的时候,有一种走法,即dp[1] = 1
当阶梯数为2的时候,有两种走法,即dp[2] = 2
当阶梯数为3的时候,有 dp[1]+dp[2]种走法,即dp[3] = dp[1]+dp[2] = 1+2 = 3
当阶梯数为4的时候,有dp[3]+dp[2]种走法,即dp[4]=dp[3]+dp[2]=3+2 = 5
…
当阶梯数为n的时候,有dp[n-1]+dp[n-2]种走法,即dp[n]=dp[n-1]+dp[n-2]
【代码实现】
let climbStairs=function(n){
let dp=[], //声明一个空数组
dp[0]=0,dp[1]=1,dp[2]=2 //给数组的1,2,3项赋值
for(let i=3; i<=n; i++){ //从第三项开始循环到第n项
dp[i]=dp[i-1]+dp[i-1] //实现规则
}
return dp[n]//返回最后一项
}