Easy
题目描述
斐波那契数(通常用 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
解题思路
这是经典的斐波那契数列问题,有多种解法可以实现:
方法一:递归法 最直观的解法是直接按照定义进行递归实现,但时间复杂度为 O(2^n),在 n 较大时效率很低。
方法二:记忆化递归 在递归的基础上加入缓存机制,避免重复计算,时间复杂度降到 O(n)。
方法三:动态规划 使用数组自底向上计算,时间复杂度 O(n),空间复杂度 O(n)。
方法四:空间优化的动态规划(推荐) 由于斐波那契数只需要前两个数的值,我们只需要两个变量来存储前两个状态即可,这样空间复杂度可以优化到 O(1)。
考虑到题目中 n 的范围较小(≤30),各种方法都可以通过,但空间优化的动态规划是最优解,既保证了时间效率又节省了空间。
代码实现
class Solution {
public:
int fib(int n) {
if (n <= 1) return n;
int prev2 = 0, prev1 = 1;
for (int i = 2; i <= n; i++) {
int curr = prev1 + prev2;
prev2 = prev1;
prev1 = curr;
}
return prev1;
}
};
class Solution:
def fib(self, n: int) -> int:
if n <= 1:
return n
prev2, prev1 = 0, 1
for i in range(2, n + 1):
curr = prev1 + prev2
prev2, prev1 = prev1, curr
return prev1
public class Solution {
public int Fib(int n) {
if (n <= 1) return n;
int prev2 = 0, prev1 = 1;
for (int i = 2; i <= n; i++) {
int curr = prev1 + prev2;
prev2 = prev1;
prev1 = curr;
}
return prev1;
}
}
/**
* @param {number} n
* @return {number}
*/
var fib = function(n) {
if (n <= 1) return n;
let prev2 = 0, prev1 = 1;
for (let i = 2; i <= n; i++) {
let curr = prev1 + prev2;
prev2 = prev1;
prev1 = curr;
}
return prev1;
};
复杂度分析
| 复杂度类型 | 复杂度 |
|---|---|
| 时间复杂度 | O(n) |
| 空间复杂度 | O(1) |
相关题目
. Climbing Stairs (Easy)
. N-th Tribonacci Number (Easy)