class Solution {
public:
int climbStairs(int n) { //Fibonacci f(n)=f(n-1)+f(n+1)
vector<int> step(n,0);//初始化n个值为0的元素
step[0]=1;
step[1]=2;
for(int i=2;i<n;++i)
step[i]=step[n-1]+step[n-2];
return step[n-1];
}
}
原采用方法(递归) 当n=44,错误
原因:n>=42 时间超时,无记忆递归,重复计算,可存储已计算的值
class Solution {
public:
int climbStairs(int n) { //Fibonacci f(n)=f(n-1)+f(n+1)
if(n==0)
return 0;
if(n==1)
return 1;
if(n==2)
return 2;
return climbStairs(n-1)+climbStairs(n-2);
}
};
修改后:
class Solution {
public:
unordered_map<int,int> cache;
int climbStairs(int n) { //key存在,find返回key对应的迭代器,
//key不存在,find返回unordered_map::end
if(cache.find(n)!=cache.end()) //判断key是否存在于当前的unordered_map中
return cache[n];
int res = 0;
if (n == 0) res = 0;
else if (n == 1) res= 1;
else if (n == 2) res = 2;
else res = climbStairs(n-1) + climbStairs(n-2);
cache[n]=res;
return res;
}
};