递归公式方法会出现超时(时间复杂度大于On^2)
方法一:依然使用递归思想,由于递归过程中会出现反复计算问题,所以定义两个变量分别记录f(n-1)和f(n-2)的值,避免重复计算,减小时间复杂度
class Solution {
public:
int climbStairs(int n) {
if(n == 1){
return 1;
}
if(n == 2){
return 2;
}
int result = 0;
int pre1 = 2;
int pre2 = 1;
for(int i=3;i<=n;i++){
result = pre1 + pre2;
pre2 = pre1;
pre1 = result;
}
return result;
}
};
方法二:使用HashMap记录递归中间值
import java.util.HashMap;
import java.util.Map;
class Solution {
// 引入HashMap存储计算过程中间值
private Map<Integer,Integer> storeMap = new HashMap();
public int climbStairs(int n) {
if(n == 1){
return 1;
}
if(n == 2){
return 2;
}
// 如果在HashMap中可以找到值,则返回出去
if(null != storeMap.get(n)){
return storeMap.get(n);
}else{
// 在HashMap中没有存在过,则调用递归方式求解f(n),并将其值存入HashMap中
int result = climbStairs(n - 1) + climbStairs(n - 2);
storeMap.put(n,result);
return result;
}
}
}