返回

斐波那契的回响:探寻最长斐波那契子序列的长度

后端

引言

在数学的广袤世界中,斐波那契序列以其优雅的递推模式和丰富的应用而著称。它的身影穿梭于自然界、金融市场和计算机科学领域,留下了一串串令人着迷的足迹。LeetCode 873 题正是对斐波那契序列的一次巧妙探索,它挑战我们找到一个序列中最长的斐波那契子序列的长度。

斐波那契的足迹

斐波那契序列由以下递推公式定义:

F(0) = 0
F(1) = 1
F(n) = F(n-1) + F(n-2)

这意味着序列中的每个数字都是前两个数字之和。斐波那契序列的前几项为:

0, 1, 1, 2, 3, 5, 8, 13, 21, 34, ...

题目解析

LeetCode 873 题要求我们找到一个给定序列中最长斐波那契子序列 的长度。斐波那契子序列是指一个序列,其中每个元素都是斐波那契序列中的一个数字,并且顺序与原始序列一致。例如,序列 [1, 2, 3, 5, 8] 是一个斐波那契子序列,因为它是斐波那契序列 [0, 1, 1, 2, 3, 5, 8, 13, 21, 34, ...] 的子序列。

哈希表的妙用

为了有效地解决这个问题,我们可以使用哈希表来存储序列中的元素。哈希表是一种数据结构,它允许我们根据键快速查找和访问元素。在本例中,我们将序列中的每个元素作为哈希表中的键。

动态规划的优雅

哈希表为我们提供了快速查找元素的手段,但我们还需要一种方法来跟踪最长的斐波那契子序列。为此,我们将使用动态规划技术。动态规划是一种自底向上解决问题的方法,它将问题分解成较小的子问题,并存储它们的解决方案。

算法步骤

我们使用一个二维数组 dp 来存储斐波那契子序列的长度。dp[i][j] 表示以序列中第 i 个元素和第 j 个元素结尾的最长斐波那契子序列的长度。

算法步骤如下:

  1. 初始化 dp 数组,将所有元素设置为 2(代表长度为 2 的平凡斐波那契子序列)。
  2. 对于序列中的每个元素 `arr[i]:
    • 在哈希表中查找 arr[i] - arr[j],其中 j < i
    • 如果找到,更新 dp[i][j]dp[j][i] + 1。
  3. 找出 dp 数组中的最大值。

复杂度分析

该算法的时间复杂度为 O(n^2),其中 n 是序列的长度。

示例

考虑序列 arr = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

  • 哈希表存储:
{
    1: 0,
    2: 1,
    3: 2,
    4: 3,
    5: 4,
    6: 5,
    7: 6,
    8: 7,
    9: 8,
    10: 9
}
  • 动态规划过程:
dp = [
    [2, 2, 2, 2, 2, 2, 2, 2, 2, 2],
    [2, 2, 3, 2, 2, 2, 2, 2, 2, 2],
    [2, 2, 3, 4, 2, 2, 2, 2, 2, 2],
    [2, 2, 2, 4, 2, 2, 2, 2, 2, 2],
    [2, 2, 2, 2, 3, 2, 2, 2, 2, 2],
    [2, 2, 2, 2, 3, 4, 2, 2, 2, 2],
    [2, 2, 2, 2, 3, 4, 5, 2, 2, 2],
    [2, 2, 2, 2, 3, 4, 5, 6, 2, 2],
    [2, 2, 2, 2, 3, 4, 5, 6, 7, 2],
    [2, 2, 2, 2, 3, 4, 5, 6, 7, 8]
]
  • 最长斐波那契子序列的长度:8

结语

LeetCode 873 题是一个精彩的算法挑战,它结合了哈希表和动态规划技术的精髓。通过理解斐波那契序列的性质和巧妙地运用数据结构,我们可以有效地解决这个问题,揭示序列中最长的斐波那契子序列的长度。