携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第4天,点击查看活动详情
前言
小白算法比较菜,希望能激励我每日更新,从leetcode第一题开始,2022年目标300题,记录从0到1的全过程!!
70.爬楼梯
70. 爬楼梯
假设你正在爬楼梯。需要 n 阶你才能到达楼顶。
每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?
F(0) = 0,F(1) = 1
F(n) = F(n - 1) + F(n - 2),其中 n > 1
给定 n ,请计算 F(n) 。
示例1
输入: n = 2
输出: 2
解释: 有两种方法可以爬到楼顶。
-
1 阶 + 1 阶
-
2 阶
示例2
输入: n = 3
输出: 3
解释: 有三种方法可以爬到楼顶。
-
1 阶 + 1 阶 + 1 阶
-
1 阶 + 2 阶
-
2 阶 + 1 阶
2.解析
昨天写了斐波那契数,分享了两个做法,递归和记忆数组。这个题和斐波那契是一样的做法,但是这题n的范围是从1-45,当输入45的时候,就会超时。
2.1解法(递归)
最容易想到的解法那就是递归求解。代码简洁,易懂。但是递归在数目较大情况下经常会出现栈溢出的情况。空间复杂度O(n),时间复杂度O(2^n)。
class Solution {
public int climbStairs(int n) {
if(n==1) return 1;
if(n==2) return 2;
return climbStairs(n-1) + climbStairs(n-2);
}
}
提交结果
时间超出限制
2.2解法(记忆数组)
在解法1的基础上进一步思考,能否用O(n)的时间复杂度完成呢?
这里用db记忆数组,实现时间复杂度O(n),空间复杂度也是O(n),也完美的解决了栈溢出。
class Solution {
public int climbStairs(int n) {
int[] db = new int[50];
db[1] = 1;
db[2] = 2;
for(int i = 3; i <= n; i++) {
db[i] = db[i-1] + db[i-2];
}
return db[n];
}
}
提交排名
3.结束
递归是经常会遇到的一种算法题型,那么如果都引入一个记忆数组db,就可以大大减少算法时间复杂度,也会减少栈溢出的风险。这个题的测试数据中,输入最大的45时,就会出现时间溢出。减少递归。