LeetCode 509 Fibonacci Number
概述
https://leetcode.com/problems/fibonacci-number/
动态规划法(递归法)
- base case:0 与 1
 - 状态:n
 - 选择:无
 - dp 函数 / 数组的定义:直接存储结果
 
代码:
class Solution {
public:
    array<int, 31> dp;
    int fib(int n) {
        for (auto& d : dp) d = -1;
        dp[0] = 0;
        dp[1] = 1;
        return helper(n);
    }
    
    int helper(int n) {
        if (dp[n] != -1) return dp[n];
        dp[n] = helper(n-1) + helper(n-2);
        return dp[n];
    }
};
动态规划法(迭代法)
下面这个会 RE:
class Solution {
public:
    int fib(int n) {
        vector<int> dp(n + 1, -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];
    }
};
因为 n 可能为 0,导致 dp[1] 越界。
改正后:
class Solution {
public:
    int fib(int n) {
        if (n == 0) return 0;
        vector<int> dp(n + 1, -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];
    }
};
进一步的空间优化:
class Solution {
public:
    int fib(int n) {
        if (n == 0) return 0;
        if (n == 1) return 1;
        int dpi2 = 0, dpi1 = 1, dpi;
        for (int i = 2; i <= n; i ++) {
            dpi = dpi1 + dpi2;
            dpi2 = dpi1;
            dpi1 = dpi;
        }
        return dpi;
    }
};