题干:
假设你正在爬楼梯。需要 n 阶你才能到达楼顶。
每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?
注意:给定 n 是一个正整数。
示例:
核心思想:
这题明显是一道递归题,通用公式是climbStairs(n) = climbStairs(n-1)+climbStairs(n-2),但是直接使用递归计算会超时间,总结原因后发现是做了过多的重复计算,比如n=5时,climbStairs(3)就被计算了两次,为了节省计算时间,就需要把已经计算出来的结果储存进去,因为不知道极限值为多少,也防止为了过度计算,此处采用了map进行存储
初步解法:
class Solution {
private HashMap<Integer,Integer> map;
public int climbStairs(int n) {
map = new HashMap<>();
map.put(1,1);
map.put(2,2);
map.put(3,3);
if(map.get(n) == null)
countValue(n);
return map.get(n);
}
private void countValue(int n) {
if(map.get(n-1) == null)
countValue(n-1);
if(map.get(n-2) == null)
countValue(n-2);
int value = map.get(n-1)+map.get(n-2);
map.put(n,value);
}
}
优化:
可以考虑非递归方式实现,从小到大计算值即可