关于java:offer-10I-斐波那契数列

27次阅读

共计 725 个字符,预计需要花费 2 分钟才能阅读完成。

斐波那契数列

看到这其实就是一个递归函数,然而 纯递归须要大量反复的递归计算,超时

题目剖析


1 办法会超时,须要计算大量数据

  • 记忆化递归法:
    在递归法的根底上,新建一个长度为 n 的数组,用于在递归时存储 f(0)f(0) 至 f(n)f(n) 的数字值,反复遇到某数字则间接从数组取用,防止了反复的递归计算。
  • 动静布局:
    以斐波那契数列性质 f(n+1)=f(n)+f(n-1)f(n+1)=f(n)+f(n−1) 为 转移方程

    题解

  • 记忆化递归法
    首先新建一个长度为 n 的数组,用来存储 arr[0]-arr[n], 也就是 f(0)-f(n)的值

    为什么要对 1000000007 取模大数阶乘,大数的排列组合等,个别都要求将输入后果对 1000000007 取模 为什么总是 1000000007 呢 = = 大略≖‿≖✧是因为:(我猜的,不服你打我呀~)1. 1000000007 是一个质数 2. int32 位的最大值为 2147483647,所以对于 int32 位来说 1000000007 足够大 3. int64 位的最大值为 2^63-1,对于 1000000007 来说它的平方不会在 int64 中溢出 所以在大数相乘的时候,因为(a∗b)%c=((a%c)∗(b%c))%c,所以相乘时两边都对 1000000007 取模,再保留在 int64 外面不会溢出 。◕‿◕。
  • 动静规划法
    不存入数组,间接求和,和始终在变

  • 循环求余法:
    大数越界:随着 n 增大, f(n)会超过 Int32 甚至 Int64 的取值范畴,导致最终的返回值谬误。

    即,对因子取模后再取模和对最终后果取模的成果是一样的。
    题目中有个用 1000000007 取模,如果数字越界就取模 %1000000007,对 1e9+ 7 范畴内的数取模也是自身,没有影响,然而 100000008 取模后就等于 1。

正文完
 0