当前位置:   article > 正文

Leetcode509:斐波那契数

Leetcode509:斐波那契数

原文链接:509. 斐波那契数 - 力扣(LeetCode)


题目

        斐波那契数 (通常用 F(n) 表示)形成的序列称为 斐波那契数列 。该数列由 0 和 1 开始,后面的每一项数字都是前面两项数字的和。也就是:

        F(0) = 0,F(1) = 1
        F(n) = F(n - 1) + F(n - 2),其中 n > 1
        给定 n ,请计算 F(n) 。

示例 1:

输入:n = 2
输出:1
解释:F(2) = F(1) + F(0) = 1 + 0 = 1

示例 2:

输入:n = 3
输出:2
解释:F(3) = F(2) + F(1) = 1 + 1 = 2

示例 3:

输入:n = 4
输出:3
解释:F(4) = F(3) + F(2) = 2 + 1 = 3

提示:

0 <= n <= 30

方法一:

      递归 

时间:8ms  空间:38.1MB

  1. class Solution {
  2. public int fib(int n) {
  3. if(n>1) return fib(n-1)+fib(n-2);
  4. return n;
  5. }
  6. }

方法二:

        滑动窗口

时间:0ms  空间:38MB

  1. class Solution {
  2. public int fib(int n) {
  3. if (n < 2) {
  4. return n;
  5. }
  6. int p = 0, q = 0, r = 1;
  7. for (int i = 2; i <= n; ++i) {
  8. p = q; //第一个数等于第二个数
  9. q = r; //第二个数等于上一次的和
  10. r = p + q;//第一个数+第二个数
  11. }
  12. return r;
  13. }
  14. }

方法三:

        通项公式。

        斐波那契数 F(n)F(n) 是齐次线性递推,根据递推方程 F(n)=F(n−1)+F(n−2),可以写出这样的特征方程:x^2=x+1

                                                                                                               注:引用Leetcode官方题解

时间:0ms  空间:38MB

  1. class Solution {
  2. public int fib(int n) {
  3. double sqrt5 = Math.sqrt(5);
  4. double fibN = Math.pow((1 + sqrt5) / 2, n) - Math.pow((1 - sqrt5) / 2, n);
  5. return (int) Math.round(fibN / sqrt5);
  6. }
  7. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/代码探险家/article/detail/1021291
推荐阅读
相关标签
  

闽ICP备14008679号