题目
假设你正在爬楼梯。需要 n 阶你才能到达楼顶。
每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?
示例 1:
输入:n = 2
输出:2
解释:有两种方法可以爬到楼顶。
- 1 阶 + 1 阶
- 2 阶
示例 2:
输入:n = 3
输出:3
解释:有三种方法可以爬到楼顶。
- 1 阶 + 1 阶 + 1 阶
- 1 阶 + 2 阶
- 2 阶 + 1 阶
提示:
1 <= n <= 45
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/climbing-stairs
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
题解一:递归求解
我也是第一次刷力扣,发现他的题解跟我之前写的题解形式不一样。慢慢来适应吧。
class Solution {
public int climbStairs(int n) {
if(n==1) return 1;
if(n==2) return 2;
return climbStairs(n-1)+climbStairs(n-2);
}
}
这个答案是正确的,但是超出时间限制了
看上面的图我们知道,是因为f(4),f(3)等等重复计算,时间复杂度太高了。
题解二:哈希表法
那么我们就一次计算,可以用到哈希表。
已经计算好的数值,存入哈希表,这样就不用重复计算。
class Solution {
private HashMap<Integer,Integer> shortMap=new HashMap<>();
public int climbStairs(int n) {
if(n==1) return 1;
if(n==2) return 2;
if(null !=shortMap.get(n))
return shortMap.get(n);
else{
int result =climbStairs(n-1)+climbStairs(n-2);
shortMap.put(n,result);
return result;//result要放在这里
}
}
}
HashMap放在函数里面,结果也是正确的,但是为什么超时了
class Solution {
public int climbStairs(int n) {
HashMap<Integer,Integer> shortMap=new HashMap<>();//函数里面,不能有private和public
if(n==1) return 1;
if(n==2) return 2;
if(null !=shortMap.get(n))//前后其实都一样
return shortMap.get(n);
else{
int result =climbStairs(n-1)+climbStairs(n-2);
shortMap.put(n,result);
return result;
}
}
}
题解三:动态规划
参考上图中的右下角部分。
class Solution {
public int climbStairs(int n) {
if(n==1) return 1;
if(n==2) return 2;
int result=0;
int pre=2;
int prePre=1;
for(int i=3;i<=n;i++){
result=pre+prePre;
prePre=pre;
pre=result;
}
return result;
}
}