LeetCode:509 斐波那契额数列

241 阅读1分钟

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

题目

写一个函数,输入 n ,求斐波那契(Fibonacci)数列的第 n 项(即 F(N))。斐波那契数列的定义如下:

F(0) = 0,   F(1) = 1
F(N) = F(N - 1) + F(N - 2), 其中 N > 1.

斐波那契数列由 0 和 1 开始,之后的斐波那契数就是由之前的两数相加而得出。

答案需要取模 1e9+7(1000000007),如计算初始结果为:1000000008,请返回 1。

示例 1:

输入:n = 2
输出:1

示例 2:

输入:n = 5
输出:5

提示:

  • 0 <= n <= 100

解题

解题一:HashMap

思路

从 2 开始遍历到 n,使用 HashMap 存储已经计算过的结果

代码

class Solution {
    public int fib(int n) {
        HashMap<Integer, Integer> hashMap = new HashMap<>();
        hashMap.put(0, 0);
        hashMap.put(1, 1);
        for (int i = 2; i <= n; i++) {
            int value = (hashMap.get(i - 1) + hashMap.get(i - 2))% 1000000007;
            hashMap.put(i, value);
        }
        return hashMap.get(n);
    }
}

总结

  • 执行耗时:1 ms,击败了 100.00% 的 Java 用户
  • 内存消耗:38.1 MB,击败了 18.55% 的 Java 用户

解题二:动态规划

解题思路

使用三个数,记录 f(n)、f(n-1)、f(n-2) 实现 f(n) = f(n-1) + f(n-2)

代码

class Solution {
    public int fib(int n) {
        if(n<2){
            return n;
        }
        int f1 = 0;
        int f2 = 1;
        int f3 = 1;
        for (int i = 2; i < n; i++) {
            f1 = f2;
            f2 = f3;
            f3 = (f1 + f2) % 1000000007;
        }
        return f3;
    }
}

总结

性能分析

  • 执行耗时:0 ms,击败了 100.00% 的 Java 用户
  • 内存消耗:37.9 MB,击败了 26.10% 的 Java 用户