509. 斐波那契数
题目链接:509. 斐波那契数
这个数列从第三项开始,每一项都等于前两项之和。
递归解法:
class Solution {
//递归
// 1.int返回值,参数n
// 2.终止条件 N < 2
public int fib(int n) {
if(n < 2) return n;
return fib(n-1) + fib(n-2);
}
}
参考链接:
https://leetcode-cn.com/problems/fibonacci-number/solution/by-lovexh-xhrr/
动态规划解法:
五部曲:
- 确认dp[i]含义
- 递推公式
- dp数组如何初始化
- 遍历顺序:一般都是从前向后
- 打印dp数组
参考链接:
labuladong动态规划题解
代码随想录动态规划题解
class Solution {
public int fib(int n) {
if(n<=1) return n;
int[] dp = new int[n+1];
dp[0] = 0;
dp[1] = 1;
for(int i=2;i<=n;i++){
dp[i]=dp[i-1]+dp[i-2];
}
return dp[n];
}
}
根据labuladong得到第一步
java版本
进阶:我们不需要去维护一个dp的数组,我们只需要维护3个变量即可
自顶向下(从前向后)
递归,记得画出递归树,来分析时间复杂度
递归的三个条件:
1,大问题拆解为前2个数之和
2,子问题是全部一样
3,最小的子问题是n=1||2时,就返回1
//有输入输出版本
public class DiGui {
public static void main(String[] args){
//数列:1,1,2,3,5,8 ......
System.out.print( f(6) );//输出数列的第几位
}
public static int f(int n){
if( n == 1 || n == 2 )
return 1;
else
return f( n - 1 )+f( n - 2 );
}
}
C实现
#include<iostream>
#include<string.h>
using namespace std;
int Fib(int n){
if(n==0)
return 0;
else if(n==1)
return 1;
else
return Fib(n-1)+Fib(n-2);
}
int main()
{
int n;
cout<<"请输入一个数"<<endl;
cin>>n;
cout<<"结果为:"<<endl;
cout<<Fib(n)<<endl;
return 0;
}
剑指 Offer 10- I. 斐波那契数列
题目链接:
剑指 Offer 10- I. 斐波那契数列
class Solution {
public int fib(int n) {
//压缩状态后
int a = 0, b = 1, sum;
for(int i = 0; i < n; i++){
sum = (a + b) % 1000000007;
a = b;
b = sum;
}
return a;
}
}
动态规划dp
经典问题
斐波那契数列
爬台阶
+递归
和斐波那契像
用sout把每次结果输出
https://www.bilibili.com/video/BV1wE411J766
参考链接:https://blog.youkuaiyun.com/qq_42259469/article/details/84754391