leetcode top100挑战, 每天不鸽一道题之 爬楼梯(6/100)

393 阅读2分钟

这是我参与更文挑战的第14天,活动详情查看: 更文挑战

题目描述

爬楼梯

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

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

注意:给定 n 是一个正整数

leetcode-cn.com/problems/cl…

// 示例1 
输入: 2
输出: 2
解释: 有两种方法可以爬到楼顶。
1.  1 阶 + 12.  2// 示例2 
输入: 3
输出: 3
解释: 有三种方法可以爬到楼顶。
1.  1 阶 + 1 阶 + 12.  1 阶 + 23.  2 阶 + 1

标签

动态规划

解题分析

1. 动态规划

老经典题目了,就写个最简单的方法。

已知我们从平地上开始走台阶,所以我们是从0开始的。
由于腿短,我们只有两种方法来爬楼梯。
1.12.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阶台阶我们看看 
10 + 1 = 1 
21 + 1 = 2
32 + 1 = 3
43 + 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]
};

image.png

image.png

最后

从今天开始不鸽,每天一道算法题并发布文章,首先想要解决的题组为Top100,第六道题目打完收工!!