[简单]算法:爬楼梯

145 阅读2分钟

爬楼梯

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第17天,点击查看活动详情

70. 爬楼梯

算题

假设你正在爬楼梯。需要 n 阶你才能到达楼顶。

每次你可以爬 12 个台阶。你有多少种不同的方法可以爬到楼顶呢?

示例 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]
};

附上提交结果:

image.png