这道题目是经典的 斐波那契数列 问题。题目要求给定一个整数
,返回第
个斐波那契数。
斐波那契数列的定义是:
递推关系: 和爬楼梯问题类似,我们可以通过递推公式
来计算第
个斐波那契数。
LeetCode是一个广受欢迎的在线编程平台,专注于算法和数据结构的练习。它提供了数千道编程题目,涵盖从简单到困难的各种难度,帮助程序员提升解决问题的能力,准备技术面试,并加深对计算机科学基础知识的理解。 通过逐步解析不同类型的题目,希望能够帮助读者更好地理解算法的应用,掌握解题技巧,并提高编程能力。每篇文章将围绕特定的主题或算法展开,提供详细的解题思路以及代码实现。

斐波那契数列是一个从 0 开始的数列,后面的每一项是前两项的和:
, 其中
。
假设我们想计算第
项的斐波那契数
,我们可以利用递推关系:
和
,
计算出
。
举个例子:
初学者可能会想到使用递归,即不停地调用
和
来得到结果。这是最直观的想法,但它的效率不高,因为很多计算会被重复执行。比如计算
时,会重复计算
等。
int fib(int n) {
if (n == 0) return 0;
if (n == 1) return 1;
return fib(n-1) + fib(n-2);
}为了解决递归中重复计算的问题,我们可以用动态规划,即从底向上计算,先计算小的数值,逐步推导出大的数值。
我们可以用一个数组来存储已经计算过的斐波那契数,从
和
开始,一步步推导到
。
表示第 i 个斐波那契数。
。
,直到
。
。
这种方法不会有重复计算,因此效率非常高。
其实我们不需要一个数组来存储所有的斐波那契数。因为在计算第
项时,我们只需要前两项
1) 和
,所以我们可以只用两个变量来记录这两项,不断向前推导。
和 prev2
,分别对应
和
。
这就是斐波那契数列问题的基本思路。
class Solution:
def fib(self, n: int) -> int:
# 如果 n 是 0 或 1,直接返回 n
if n == 0:
return 0
elif n == 1:
return 1
# 使用两个变量来存储前两个斐波那契数,prev2 是 F(n-2),prev1 是 F(n-1)
prev2, prev1 = 0, 1
# 计算从 F(2) 到 F(n) 的值
for i in range(2, n + 1):
# 当前的斐波那契数是前两个数的和
current = prev1 + prev2
# 更新前两个数,继续计算下一个
prev2 = prev1
prev1 = current
# 最后 prev1 中保存的是 F(n)
return prev1或
, 直接返回
,因为
。
。
class Solution {
public:
int fib(int n) {
// 如果 n 是 0 或 1,直接返回 n
if (n == 0) return 0;
if (n == 1) return 1;
// prev2 保存 F(n-2),prev1 保存 F(n-1)
int prev2 = 0, prev1 = 1, current = 0;
// 从 F(2) 到 F(n) 逐步计算
for (int i = 2; i <= n; ++i) {
// 当前的斐波那契数是前两个数的和
current = prev1 + prev2;
// 更新前两个斐波那契数
prev2 = prev1;
prev1 = current;
}
// 返回第 n 个斐波那契数
return current;
}
};或
, 直接返回
。
,并返回该值。