【LeetCode】509. 斐波那契数

137 阅读1分钟

「这是我参与2022首次更文挑战的第4天,活动详情查看:2022首次更文挑战」。

题目

斐波那契数 (通常用 F(n) 表示)形成的序列称为斐波那契数列 。该数列由 0 和 1 开始,后面的每一项数字都是前面两项数字的和。也就是:

F(0) = 0F(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

示例 2:

输入:n = 3
输出:2
解释:F(3) = F(2) + F(1) = 1 + 1 = 2

示例 3:

输入:n = 4
输出:3
解释:F(4) = F(3) + F(2) = 2 + 1 = 3

提示:

  • 0 <= n <= 30

题解

思路

正因大家对斐波那契数列过于熟悉,使得这道十分适合入门动态规划的题被大家用循环和通项公式当成普通的数学问题一掠而过。

那么如何使用动态规划来做这道题呢?首先动态规划解题主要有五步:

  1. 确定 dp 数组以及下标的含义
  2. 确定递推公式
  3. dp 数组边界值的初始化(边界值指无法通过递推公式求得的,辅助递推公式计算的初始数值)
  4. 确定遍历顺序
  5. 举例推导 dp 数组
  6. 由于最后需要求出第n位的结果,则可以确定 dp[i] 为斐波那契数列第i位的值
  7. 这道题递推公式直接给了,为 dp[i] = dp[i - 1] + dp[i - 2]
  8. dp 数组的初始化需要注意,一般题目不会给定初始化的值,因此很多初学者会漏初始化甚至忘记初始化!结合递推公式 dp[i] = dp[i - 1] + dp[i - 2] 可以得出——dp[i] 的计算至少需要两个相邻的常值,这里题目给定了 F(0) = 0,F(1) = 1,即 dp[0]=0, dp[1]=1; 由于斐波那契数列与数组一样是以第 0 位为首位,且循环终止条件是 i>n,因此 dp[] 的长度需定为 n+1
  9. 从递推公式 dp[i] = dp[i - 1] + dp[i - 2] 可知第 i 位是由 i-1 和 i-2 推得,且根据提示中 n 的取值范围(0 <= n <= 30)以及给定的初始值 F(0) = 0,F(1) = 1 得出遍历顺序为从前到后
  10. 在代码中循环打印递推公式的结果验证是否正确

代码

class Solution {
    public int fib(int n) {
        int dp[] = new int[n+1];
        dp[0] = 0;
        if(n < 2)
          return n;
        dp[1] = 1;
        for(int i=2; i<=n; i++){
            dp[i] = dp[i-1] + dp[i-2];
        }
        return dp[n];
    }
}

结语

业精于勤,荒于嬉;行成于思,毁于随。