509. 斐波那契数

509. 斐波那契数

509. 斐波那契数

// [509. 斐波那契数](https://leetcode-cn.com/problems/fibonacci-number/)
// 动态规划: 1) 确定DP数组 使用一维数组dp[i]表示第i个数字, 2) 确定递推公式 3) 确定初始状态 4) 确定遍历过程 5) 模拟结果以便于debug
// 时间复杂度O(n), 空间复杂度O(n)
class Solution {
    // 完整dp解法
    public int fib(int n) {
        if (n == 0) {
            return 0;
        }
        if (n == 1) {
            return 1;
        }
        int[] dp = new int[n + 1];
        dp[0] = 0;
        dp[1] = 1;
        for (int i = 2; i < n + 1; i ++) {
            dp[i] = dp[i-1] + dp[i-2];
        }
        return dp[n];
    }
}
// 动态规划,维护了整个状态转移过程, 但是实际上本题只需要两个状态即可
// 时间复杂度O(n), 空间复杂度O(1)
class Solution2 {
    public int fib(int n) {
        if (n == 0) {
            return 0;
        }
        if (n == 1) {
            return 1;
        }
        int dp1 = 0;
        int dp2 = 1;
        for (int i = 2; i < n + 1; i ++) {
            int temp = dp1;
            dp1 = dp2;
            dp2 = temp + dp1;
       }
        return dp2;
    }
}

// 其他解法: 备忘录法, 利用斐波那契通项公式, 矩阵快速幂, 还有利用数组保存了30个项直接返回的 递归一行代码: return n <= 1 ? n : fib(n - 1) + fib(n - 2);
// 递归算法: 时间O(2^n), 空间O(n)
posted @ 2022-03-06 16:32  -Rocky-  阅读(29)  评论(0编辑  收藏  举报