爬楼梯
一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第17天,点击查看活动详情。
70. 爬楼梯
算题
假设你正在爬楼梯。需要 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 种
1
-
二层 2 种
1 , 2
-
三层 3 种
1 -> 3 , 2 -> 3 , 1 -> 2 -> 3
-
四层 5 种
1 -> 3 -> 4 -> 5, 1 -> 3 -> 5, 2 -> 3 -> 4 -> 5, 2 -> 3 -> 5, 1 -> 2 ->3 -> 5, 1 -> 2 -> 3 -> 4 -> 5
-
五层 8 种
...
从第三层开始,每一次到达的次数为前两次次数相加的和。
其实这也不难理解,因为你想要到达第三层,必须经过前两层,那么前两层到达的最大次数,是被第三层到达的次数包含在内的。
打个比方: 假设你要到达第三层,求到达第三层的步数,那么是不是可以认为是到底第达层后 + 2层,或者到达第二层后 + 1 层 可以求得。同理,要到达第四层,可以认为是 到第二层之后 + 2 层, 或者 到达第三层后 + 1层。
动态规划思路
动态规划的整体思路就是将到达每一层的最大次数标记出来,然后来决定下一层需要多少次。也就是说每一层到达的次数是由前面到达次数所决定的。
设定一个 到达层数的数组
dpList = new Array(n).fill(0)
并且假定目前为止都是0.
那么第一层次数为 : dpList[0] = 1
第二层次数为: dpList[1] = 2
从第三层开始,由前面两层的次数相加: dpList[2] = dpList[0] + dpList[1]
.....
第 n 层: dplist[n] = dpList[n - 1] + dpList[n - 2]
最终可以实现代码:
var climbStairs = function(n) {
const dpList = new Array(n).fill(0)
dpList[0] = 1
dpList[1] = 2
for (let index = 2 ; index < n; index++) {
dpList[index] = dpList[index - 1] + dpList[index - 2]
}
return dpList[n - 1]
};
附上提交结果: