这是我参与11月更文挑战的第1天,活动详情查看:2021最后一次更文挑战
leetcode509-斐波那契数
前文
本文为菜鸟的刷题记录,仅用作笔记使用,并非最佳解决方案。
题目信息
斐波那契数,通常用 F(n) 表示,形成的序列称为 斐波那契数列 。该数列由 0 和 1 开始,后面的每一项数字都是前面两项数字的和。也就是:
F(0) = 0,F(1) = 1
F(n) = F(n - 1) + F(n - 2),其中 n > 1
给你 n ,请计算 F(n) 。
解题思路分析
解法1
本解法主要是依据正常的递归思想进行解题。对于特殊的0和1,先进行单独的处理,使剩余项能否符合统一的递归公式。递归公式为每一项的斐波那契数,等于前两个斐波那契数的总和。因此要求目标斐波那契数,只需要得到前两项斐波那契数。而要求前两项斐波那契数,则只需要分别得到再两项的斐波那契数,并对其相加即可。因此递归可以直接对于目标数的n-1和n-2进行递归,分别计算斐波那契数。经过递归操作就会得到目标结果。
public int fib(int n) {
if(n == 0){
return 0;
}else if(n == 1){
return 1;
}else{
return fib(n-1) + fib(n-2);
}
}
解法2
本解法是通过动态规划的思想,通过dp数组对于每一项的斐波那契数进行存储,所以直接可以从数组中得到斐波那契数。也就是说首先需要一个数组进行数据存储,将每个位置的斐波那契数存储在对应的数组中。而要求目标数组只需要直接获取目标位置的前两项数值。因此出于空间复杂度角度考虑,只需要用变量存储临近两项数值即可,不需要记录全部数组。而状态转移方程就是斐波那契数的定义,每一项等于前两项的和。
public int fib(int n) {
if(n == 0){
return 0;
}else if(n == 1){
return 1;
}
int a=0,b=1,c=1;
for (int i = 2; i <= n; i++) {
c = a + b;
a = b;
b = c;
}
return c;
}
复杂度分析
- 时间复杂度 o(n)
- 空间复杂度 o(1)
后记
- 千古兴亡多少事?悠悠。不尽长江滚滚流。