leetcode 学习计划 动态规划第一天
链接: leecode地址.
1.斐波那契树
题目地址
斐波那契数公式为
F(0) = 0,F(1) = 1
F(n) = F(n - 1) + F(n - 2) , n>1
首先想到使用递归
public int fib(int n) {
if(n<=1){
return n;
}
return fib(n-1)+fib(n-2);
}
但是这种解法有问题
f(10)=f(9)+f(8);
f(9)=f(8)+f(7);
f(10)=f(8)+f(8)+f(7);
这里看出f(8)需要计算两次,如果避免这个问题,首先想到使用map去存已经计算过的值。接着想到可以直接从1往上求直接求到n,如下所示:
public int fib(int n) {
if(n<=1){
return n;
}
int a=0;
int b=1;
for(int i=2;i<n;i++){
b=a+b;
a=b-a;
}
return a+b;
}
2.第 N 个泰波那契数
题目地址
这题和第一题很相似只不过公式变成了
T0 = 0, T1 = 1, T2 = 1,
Tn= Tn -1+ Tn-2 + Tn-3(n>=3)
直接上代码:
public int tribonacci(int n) {
if(n<=1){
return n;
}
if(n==2){
return 1;
}
int a=0;
int b=1;
int c=1;
int tmp;
for(int i=3;i<n;i++){
tmp=a;
a=b;
b=c;
c=tmp+a+b;
}
return a+b+c;
}