Leetcode 70. 爬楼梯

152 阅读2分钟

Leetcode 70. 爬楼梯

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

1、题目📑

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

2、思路🧠

方法一:动态规划

动态规划其实就是常规解法可以分成多个子问题,爬第n阶楼梯的方法数量,即求两部分之和

  1. 分析题目一次可以爬1阶台阶,由此求出爬上 n-1 阶楼梯的方法数量
  2. 分析题目一次可以爬2阶台阶,由此求出爬上 n-2 阶楼梯的方法数量

根据上述的思路就可以得到 dp[n] = dp[n - 1] + dp[n - 2]

根据题目,已知 dp[0] = 1,dp[1] = 1;

方法二:斐波那契数列的第N项的求解公式

如果清楚本题是使用斐波那契数列求解,可以利用数学问题的公式进行求解。

image-20220405182354638

废话少说~~~~~上代码!

3、代码👨‍💻

第一次commit AC

class Solution {
    public int climbStairs(int n) {
        int dp [] = new int [n + 1];
        dp[0] = 1;
        dp[1] = 1;
        for(int i = 2;  i <= n ; i++) {
            dp[i] = dp[i - 1] + dp[i - 2];
        }
        return dp[n];
    }
}

时间复杂度:O(N) N为所要求的第N阶台阶

空间复杂度:O(1)

第二次commit AC

class Solution {
    public int climbStairs(int n) {
        double sqrt5 = Math.sqrt(5);
        double fib_n = Math.pow((1 + sqrt5)/2 , n + 1) - Math.pow(( 1 - sqrt5)/2 , n + 1);
        return (int) (fib_n / sqrt5);
    }
}

时间复杂度:O(log N) N为所要求的第N阶台阶

空间复杂度:O(1)

image-20220405181640027

4、总结

该题目的对高数的知识进行考察,同时要对斐波那契数列有了解和研究,对斐波那契数列的公式要能够理解并且掌握。

❤️‍来自专栏《LeetCode基础算法题》欢迎订阅❤️‍

厂长写博客目的初衷很简单,希望大家在学习的过程中少走弯路,多学一些东西,对自己有帮助的留下你的赞赞👍或者关注➕都是对我最大的支持,你的关注和点赞给厂长每天更文的动力。

对文章其中一部分不理解,都可以评论区回复我,我们来一起讨论,共同学习,一起进步!

原题链接:70. 爬楼梯 - 力扣(LeetCode) (leetcode-cn.com)