赞
踩
原文链接: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
- class Solution {
- public int fib(int n) {
- if(n>1) return fib(n-1)+fib(n-2);
- return n;
- }
- }
方法二:
滑动窗口
时间:0ms 空间:38MB
- class Solution {
- public int fib(int n) {
- if (n < 2) {
- return n;
- }
- int p = 0, q = 0, r = 1;
- for (int i = 2; i <= n; ++i) {
- p = q; //第一个数等于第二个数
- q = r; //第二个数等于上一次的和
- r = p + q;//第一个数+第二个数
- }
- return r;
- }
- }
-
方法三:
通项公式。
斐波那契数 F(n)F(n) 是齐次线性递推,根据递推方程 F(n)=F(n−1)+F(n−2),可以写出这样的特征方程:x^2=x+1
注:引用Leetcode官方题解
时间:0ms 空间:38MB
- class Solution {
- public int fib(int n) {
- double sqrt5 = Math.sqrt(5);
- double fibN = Math.pow((1 + sqrt5) / 2, n) - Math.pow((1 - sqrt5) / 2, n);
- return (int) Math.round(fibN / sqrt5);
- }
- }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。