日新计划Leetcode之 70. 爬楼梯

78 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第1天,点击查看活动详情

一、题目描述:

70. 爬楼梯 - 力扣(LeetCode) (leetcode-cn.com)

假设你正在爬楼梯。需要 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 <= n <= 45

二、思路分析:

看了很多评论,有说是斐波那契数列,也有说是动态规划的经典题。
由于个人数学不好,所以直接用官方推荐的:动态规划

  1. 动态规划推导之前,可以先自行倒推一下,假设当前位于第 n 阶,那么上一步可能在第 n-1 或者第 n-2 阶,分别需要爬 1 级台阶和 2 级台阶。因此无论在哪一阶,都是只需要求出上一步的爬法即可。比如:
  2. f(0) = 1
  3. f(1) = 1
  4. f(2) = 2 = f(0) + f(1)
  5. f(3) = 3 = f(1) + f(2)
  6. f(4) = 5 = f(2) + f(3)
  7. f(5) = 8 = f(3) + f(4)
  8. 可以自行推导一下【其实就是斐波那契数列】,所以官方的公式就为:f(x) = f(x−2) + f(x−1),官方也说明,由于每次都只能爬1阶或者2阶,所以才只需推导x-1,和x-2即可。
  9. 因此,for循环,设置3个指针,第一个指向 f(x-2),第二个指向 f(x-1),最后一个是当前,循环n次。

三、AC 代码:

class Solution {
    public int climbStairs(int n) {
        int p=0,q=0,r=1;
        for(int i=1;i<n;i++){
            p = q;
            q = r;
            r = p+q;
        }
        return r;
    }
}

范文参考

🔥总结向题解,详细到优化过程 - 爬楼梯 - 力扣(LeetCode)

【背包专项打卡】背包大法挺好 - 爬楼梯 - 力扣(LeetCode)