剑指offer 07斐波那契数列 Java

一、题目描述

题目描述
大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0,第1项是1)。
n\leq 39n≤39

示例1
输入

4

返回值

3

二、代码

方法1: 简单递归

public class Solution {
    public int Fibonacci(int n) {
        if( n==0 )
            return 0;
        if( n == 2 || n == 1 )
            return 1;
        else 
            return Fibonacci(n-1) + Fibonacci(n-2);
    }
}

方法2:动态规划
避免反复计算可以使用动态规划存储已经计算过的f(0-n-1)值于数组中,返回f(n)即可

空间复杂度优化
参考leetcode Krahets 精选评论:其实并不需要存储那么往前的数值。只要记住f(n-2)和f(n-1)即可,所以只要两个变量存一下这两个中间值即可。
(leetcode上还有一个大数越界的问题)

循环求余法:
大数越界: 随着 n 增大, f(n) 会超过 Int32 甚至 Int64 的取值范围,导致最终的返回值错误。
求余运算规则:
设正整数 x, y, px,y,p ,求余符号为⊙ ,则有
(x+y)⊙p=(x⊙p+y⊙p)⊙p 。
解析: 根据以上规则,可推出
f(n)⊙p=[f(n−1)⊙p+f(n−2)⊙p]⊙p
从而可以在循环过程中每次计算 sum=(a+b)⊙1000000007 ,此操作与最终返回前取余等价。

class Solution {
    public int fib(int n) {
        int a = 0, b = 1, sum;
        for(int i = 0; i < n; i++){
            sum = (a + b) % 1000000007;
            a = b;
            b = sum;
        }
        return a;
    }
}

题解合集

在这里~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值