写在前面:
今天划个水,写个斐波那契数,斐波那契数应该算是动态规划里的入门级别的,之前用的是递推的方式,这次试下动态规划
509.斐波那契数
斐波那契数 (通常用 F(n) 表示)形成的序列称为 斐波那契数列 。该数列由 0 和 1 开始,后面的每一项数字都是前面两项数字的和。也就是:
F(0) = 0,F(1) = 1
F(n) = F(n - 1) + F(n - 2),其中 n > 1
给定 n ,请计算 F(n) 。
示例1
输入:n = 2
输出:1
解释:F(2) = F(1) + F(0) = 1 + 0 = 1
解题思路
直接套公式
public int fib(int n) {
if(n<2){
return n;
}
int []F=new int[n+1];
F[0]=0;
F[1]=1;
for(int i=2;i<=n;i++){
F[i]=F[i-1]+F[i-2];
}
return F[n];
}
在此基础上我们在空间上优化一下,用三个变量来进行运算,空间复杂度从o(n)->o(1)。
public int fib(int n) {
if(n<2){
return n;
}
int p=0,q=0,r=1;
for(int i=2;i<=n;i++){
p=q;
q=r;
r=p+q;
}
return r;
}
同类型继续练习
1137.第N个泰波那契数
题目
泰波那契序列 Tn 定义如下:
T0 = 0, T1 = 1, T2 = 1, 且在 n >= 0 的条件下 Tn+3 = Tn + Tn+1 + Tn+2
给你整数 n,请返回第 n 个泰波那契数 Tn 的值。
示例1
输入:n = 4
输出:4
解释:
T_3 = 0 + 1 + 1 = 2
T_4 = 1 + 1 + 2 = 4
解题思路
在上一题的基础之上,换成了前三个数的累加和。
那就直接上优化空间后的代码。
public int tribonacci(int n) {
if(n==0){
return 0;
}
if(n==1){
return 1;
}
if(n==2){
return 1;
}
int p=0,q=0,r=1,s=1;
for(int i=3;i<=n;i++){
p=q;
q=r;
r=s;
s=p+q+r;
}
return s;
}