[LeetCode] 509. Fibonacci Number

Posted cff2121

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[LeetCode] 509. Fibonacci Number相关的知识,希望对你有一定的参考价值。

Easy

The Fibonacci numbers, commonly denoted F(n) form a sequence, called the Fibonacci sequence, such that each number is the sum of the two preceding ones, starting from 0 and 1. That is,

F(0) = 0,   F(1) = 1
F(N) = F(N - 1) + F(N - 2), for N > 1.

Given N, calculate F(N).

 

Example 1:

Input: 2
Output: 1
Explanation: F(2) = F(1) + F(0) = 1 + 0 = 1.

Example 2:

Input: 3
Output: 2
Explanation: F(3) = F(2) + F(1) = 1 + 1 = 2.

Example 3:

Input: 4
Output: 3
Explanation: F(4) = F(3) + F(2) = 2 + 1 = 3.

 

Note:

0 ≤ N ≤ 30.

题目大意:满足以下条件的数列F称为斐波那契数列:

1.F(0)=0,F(1)=1;

2.F(n)=F(n-1)+F(n-2);

给出一个数字x,求出F(x)的值。

 

方法:菲波那切数列除了初始条件n=0和n=1的值以外,其他的项的值都是由该项的前两项决定的,所以这是一个动态规划的问题。

方法一:递归法

递归的终止条件由斐波那契数列的初始值决定,即当n=0时结果为0,n=1时结果为1.

代码如下:

class Solution 
public:
    int fib(int N) 
        if(N==0 || N==1)return N;
        return (fib(N-1)+fib(N-2));
    
;

 

方法二:迭代法

由菲波那切数列的性质,使用循环逐个计算知道求出目标项的值。我们可以维护一个有两项的向量,下一项的值就有这两项求出。初始值n=0和n=1还是要先给出。

一次循环更新两项:

技术图片

我们由更新结果可以看出循环次数为N/2,每次循环N的值要更新为N-2.这样就能保证结果在我们维护的这个向量当中。如果N为偶数则结果为第一项,如果N为奇数结果为第二项。

值得注意的是,向量更新时的顺序,由上图为例,F(2)由F(0)和F(1)求出,而F(3)由F(1)和F(0)求出,所以要先更新向量的第一项,再更新第二项。切忌交换顺序。

代码如下:

class Solution 
public:
    int fib(int N) 
        if(N==0 || N==1)return N;
        
        vector<int> fib=0,1;
        while(N/2)
            fib[0]=fib[0]+fib[1];
            fib[1]=fib[0]+fib[1];
            N-=2;
        
        return N==0?fib[0]:fib[1];
    
;

 

以上是关于[LeetCode] 509. Fibonacci Number的主要内容,如果未能解决你的问题,请参考以下文章

[LeetCode] 509. Fibonacci Number

LeetCode #509. Fibonacci Number

[LeetCode] 509. Fibonacci Number

Fibonacci Number LT509

509. 斐波那契数

509. 斐波那契数