一 题目

二 代码
- 解法一 递归解法
重复计算了很多子问题,时间复杂度指数级别
let fib = function(N) {
if(N===0) return 0;
if(N===1) return 1;
return fib(N-1)+fib(N-2);
};
- 动态规划
利用dp table将每次计算的子问题结果存起来,以防多次重复计算
let fib=function(N){
let dp=[];
dp[0]=0;
dp[1]=1;
for(let i=2;i<=N;i++){
dp[i]=dp[i-1]+dp[i-2];
}
return dp[N];
}
- 动态规划升级版
fib(N)=fib(N-1)+fib(N-2)
因此每次计算fib(N)只需要fib(N-1)和fib(N-2)即可,那么用两个变量存储这两个值即可,
就不需要长度为N的数组占用额外空间。把空间复杂度降为1。
let fib=function(N){
let previous1=0;
let previous2=1;
if(N===0) return previous1;
if(N===1) return previous2;
for(let i=2;i<=N;i++){
res=previous1+previous2;
previous1=previous2;
previous2=res;
}
return res;
}