509. 斐波那契数
Posted 可持续化发展
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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、暴力递归
斐波那契数列的数学形式就是递归的,画一下递归树,暴力递归是从上往下递归到最低层(找到最底层,递归的终止条件),然后,从下往上依次递归出结果(把结果从最底层开始,通过不断的return,把结果计算出来)。
class Solution {
public int fib(int n) {
if(n == 0) {
return 0;
}
if(n==1 || n==2) {
return 1;
}
return fib(n - 1)+fib(n - 2);
}
}
2、带备忘录的递归解法
因为有重复计算,比如,f(18)计算了两次。
class Solution {
public int fib(int n) {
// 备忘录全初始化为 0
int[] memo = new int[n + 1];
// 进行带备忘录的递归
return helper(memo, n);
}
private int helper(int[] memo, int n) {
// base case
if (n == 0 || n == 1) return n;
// 已经计算过,不用再计算了
if (memo[n] != 0) return memo[n];
memo[n] = helper(memo, n - 1) + helper(memo, n - 2);
return memo[n];
}
}
3、dp 数组的迭代解法
在一个数组中,完成「自底向上」的推算。
class Solution {
public int fib(int n) {
if(n == 0) return 0;
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];
}
}
以上是关于509. 斐波那契数的主要内容,如果未能解决你的问题,请参考以下文章