剑指offer 题目 10-1 斐波那契数列

本文探讨了如何使用循环和递归两种方式实现斐波那契数列的计算,其中循环方法适用于所有情况,而递归方法可能会导致超时。为了优化递归,提出了使用哈希映射存储已计算的斐波那契数,避免重复计算,从而提高效率。这种方法在LeetCode等平台上能有效解决超时问题。
摘要由CSDN通过智能技术生成

10-1 斐波那契数列

题目、

写一个函数,输入 n ,求斐波那契(Fibonacci)数列的第 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 

解析

循环:利用循环,非递归方式

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

递归:用递归可以算,但LeetCode上运行时,有一些测试用例会超时

class Solution {
    public int fib(int n) {
        if (n < 2) {
            return n;
        }
        return (fib(n - 1) + fib(n - 2)) % 1000000007;
    }
}

对递归进行改进: 避免重复运算。将计算过的值用map存储起来,在每次计算前查看map中是否存在。如果计算过就直接从map中取,否则就对其进行计算,并将结果存储在map中。

import java.util.HashMap;
import java.util.Map;

//leetcode submit region begin(Prohibit modification and deletion)
class Solution {
    int constant = 1000000007;

    public int fib(int n) {
        return fib(n, new HashMap<Integer, Integer>());
    }

    public int fib(int n, Map<Integer, Integer> map) {
        if (n < 2) {
            return n;
        }
        if (map.containsKey(n)) {
            return map.get(n);
        }
        int f1 = fib(n - 1, map) % constant;
        map.put(n - 1, f1);
        int f2 = fib(n - 2, map) % constant;
        map.put(n - 2, f2);
        int ans = (f1 + f2) % constant;
        map.put(n, ans);
        return ans;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值