[剑指offer][JAVA]斐波那契数列

【问题描述】

大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0)。
n<=39

【解答思路】

1.递归(面试避免) O(n^2)

F(n)

public class Solution {
   public int Fibonacci(int n) {
       if (n == 0) return 0;
       if (n == 1) return 1;
       return Fibonacci(n - 1) + Fibonacci(n - 2);
   }
}
2.一般循环 O(n) 空间复杂度:O(n)
public class Solution {
    public int Fibonacci(int n) {
        int ans[] = new int[40];
        ans[0] = 0;
        ans[1] = 1;
        for(int i=2;i<=n;i++){
            ans[i] = ans[i-1] + ans[i-2];
        }
        return ans[n];
    }
}
3.循环优化 O(n) 空间复杂度:O(1)

0 1 1 2 3 5 8
f(6) = f(5) + f(4),只需要保存f(5) , f(4) 由f(5) -f(3) 得出
计算8 = 5+3时,只需要保存5, 3由5-2得出


public class Solution {
   public int Fibonacci(int n) {
       int a = 0, b = 1;
       for (int i = 1; i <= n - 2; i++) {
           a = a + b;
           b = a - b;
       }
       return a;
   }
}

【总结】

  1. 递归需要定义出口,从传递的参数过渡到出口
  2. 综合考虑时间复杂度和空间复杂度
发布了22 篇原创文章 · 获赞 0 · 访问量 424

猜你喜欢

转载自blog.csdn.net/dadongwudi/article/details/105039630
今日推荐