LeetCode 70. 爬楼梯

219 阅读1分钟

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 <= n <= 45

题解

这道题应该是一道水题,可是没做过的话,不明白背后的数学推导就有点难了。这道题的数学推导是什么呢

  • 一阶,只有一种爬法,就是爬一步

  • 二阶,有两种爬法

    • 1+1,先爬一步,在爬一步
    • 2,直接爬两步
  • 三阶,有三种爬法

    • 1+1+1,一步一步爬
    • 1+2,先怕一步,再爬两步
    • 2+1,先怕两步,再爬一步
  • 四阶,有五种爬法

    • 1、1+1+2
    • 2、2+2
    • 3、1+1+1+1
    • 4、1+2+1
    • 5、2+1+1

    这里可能看不出规律,但是分析就可以得到规律,因为只有两种步伐,一步或两步,那只能在两阶或者三阶的基础上走。如果在两阶基础上,有上面的第一种(1+1+2)和第二种(2+2);如果在三阶的基础上,有第三种(1+1+1+1),第四种(1+2+1)和第五种(2+1+1).到此我们其实可以总结出规律,就是f(n)=f(n-1)+f(n-2),因为相差一步就是f(n-1)的爬法,相差两步就是f(n-2)的爬法。

  • n阶,f(n)=f(n-1)+f(n-2)

所以这里就可以得出公式

  • n=1,f(n)=1
  • n=2,f(n)=2
  • n>=3,f(n)=f(n-1)+f(n-2)
class Solution {
    int[] ans = new int[46];//打表数组
    public int climbStairs(int n) {
        init();//初始化
        return ans[n];
    }
​
    void init(){//初始化函数
        ans[1] = 1;//n=1
        ans[2] = 2;//n=2
        for(int i = 3; i <= 45; i++){//n>=3
            ans[i] = ans[i-1] + ans[i-2];
        }
    }
}