Leetcode 70. 爬楼梯
一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第5天,点击查看活动详情。
1、题目📑
假设你正在爬楼梯。需要 n 阶你才能到达楼顶。
每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢
实例1:
输入:n = 2
输出:2
解释:有两种方法可以爬到楼顶。
- 1 阶 + 1 阶
- 2 阶
实例2:
输入:n = 3
输出:3
解释:有三种方法可以爬到楼顶。
- 1 阶 + 1 阶 + 1 阶
- 1 阶 + 2 阶
- 2 阶 + 1 阶
限制:
1 <= n <= 45
2、思路🧠
方法一:动态规划
动态规划其实就是常规解法可以分成多个子问题,爬第n阶楼梯的方法数量,即求两部分之和
- 分析题目一次可以爬1阶台阶,由此求出爬上
n-1阶楼梯的方法数量 - 分析题目一次可以爬2阶台阶,由此求出爬上
n-2阶楼梯的方法数量
根据上述的思路就可以得到 dp[n] = dp[n - 1] + dp[n - 2]
根据题目,已知 dp[0] = 1,dp[1] = 1;
方法二:斐波那契数列的第N项的求解公式
如果清楚本题是使用斐波那契数列求解,可以利用数学问题的公式进行求解。
废话少说~~~~~上代码!
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)
4、总结
该题目的对高数的知识进行考察,同时要对斐波那契数列有了解和研究,对斐波那契数列的公式要能够理解并且掌握。
❤️来自专栏《LeetCode基础算法题》欢迎订阅❤️
厂长写博客目的初衷很简单,希望大家在学习的过程中少走弯路,多学一些东西,对自己有帮助的留下你的赞赞👍或者关注➕都是对我最大的支持,你的关注和点赞给厂长每天更文的动力。
对文章其中一部分不理解,都可以评论区回复我,我们来一起讨论,共同学习,一起进步!