【动态规划】LeetCode 509. 斐波那契数

257 阅读1分钟

题目

斐波那契数,通常用F(n)表示,形成的序列称为斐波那契数列 。该数列由01开始,后面的每一项数字都是前面两项数字的和。也就是:
F(0) = 0F(1) = 1
F(n) = F(n - 1) + F(n - 2),其中 n > 1,
给你n,请计算F(n)。

示例1

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

主要思路

  • 首先创建一个数组dp,其中dp[i]表示题目中要求的F(n)的值
  • 然后递推公式在题目中已经给出来了:F(n) = F(n - 1) + F(n - 2)
  • 由题目中可以知道dp[0] = 0,dp[1] = 1
  • 最后dp[i]的值是由它前面两个数推出来的,所以数组是从前向后遍历

代码实现

 public int fib(int n) {
        if(n < 2){
            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];
    }

代码优化

public int fib(int n) {
        if(n < 2){
            return n;
        }
        // 从第一种实现方式可以发现dp[i]的值只与它前面两个值有关系,
        // 所以可以用三个值来替换,不用数组来表示
        int pre = 0;
        int cur = 0;
        int sum = 1;
        for(int i = 2; i <= n; i++){
            pre = cur;
            cur = sum;
            sum = pre + cur;
        }
        return sum;
    }

参考

代码随想录