兔群繁殖之谜问题解析 | 豆包MarsCode AI刷题

70 阅读3分钟

题目解析

问题背景

小R正在研究兔子的繁殖模式。题目描述了一个特殊的兔子繁殖规律:

  • 初始时有一对新生的小兔子。
  • 每对成年兔子每个月会生育一对新的小兔子。
  • 新生的小兔子需要一个月的时间才能成长为成年兔子,能够开始繁殖。
  • 兔子永远不会死亡。

给定一个整数 A,表示月份数,要求我们计算在第 A 个月末,兔子的总对数。


解题思路

从题目描述来看,兔子的繁殖规律可以用递推关系表示,即每个月的兔子总数取决于前两个月的兔子数量。这是一个经典的 斐波那契数列 问题。

具体规则如下:

  • 第 1 个月:只有 1 对兔子。

  • 第 2 个月:原来的 1 对兔子变成成年兔子,开始繁殖,再加上新生的 1 对兔子,因此总共是 2 对兔子。

  • 从第 3个月开始,每个月的兔子总数是:

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

    这表示当前月的兔子对数是前两个月兔子对数的和,原因是:

    • 当前月的兔子对数由上个月的兔子(成年兔子)和上上个月的兔子(已经长大并繁殖的新兔子)共同决定。

为了得到第 A 个月末的兔子总对数,可以利用动态规划的思想,逐月计算兔子对数。


解决步骤

  1. 初始化

    • 第 1 个月末兔子总对数为 1 对。
    • 第 2 个月末兔子总对数为 2 对。
  2. 动态规划递推

    • 从第 3 个月开始,利用递推关系 F(n) = F(n-1) + F(n-2) 计算兔子对数。
  3. 存储结果

    • 我们使用一个数组 rabbit_pairs 来存储每个月的兔子对数。数组的第 i 个元素表示第 i 个月末的兔子总对数。
  4. 返回结果

    • 返回数组中第 A 个月末的兔子对数。

代码实现

python复制代码def solution(A: int) -> int:
    # 初始化前两个月的兔子对数
    if A == 1:
        return 1
    elif A == 2:
        return 2
    
    # 创建一个数组来存储每个月的兔子对数
    rabbit_pairs = [0] * (A + 1)
    rabbit_pairs[1] = 1  # 第1个月末有1对兔子
    rabbit_pairs[2] = 2  # 第2个月末有2对兔子
    
    # 从第3个月开始,递推计算每个月的兔子对数
    for i in range(3, A + 1):
        rabbit_pairs[i] = rabbit_pairs[i - 1] + rabbit_pairs[i - 2]
    
    # 返回第A个月末的兔子对数
    return rabbit_pairs[A]

代码解析

  1. 初始化前两个月兔子对数

    • 如果 A == 1,说明我们查询的是第 1 个月,兔子总数为 1 对。
    • 如果 A == 2,说明我们查询的是第 2 个月,兔子总数为 2 对。
  2. 创建数组存储兔子对数

    • 创建一个大小为 A + 1 的数组 rabbit_pairs 来存储每个月的兔子对数。
    • rabbit_pairs[i] 表示第 i 个月末的兔子对数。
  3. 递推计算

    • 使用一个 for 循环从第 3 个月开始,利用前两个月的兔子对数计算当前月的兔子对数。
    • 递推公式是:rabbit_pairs[i] = rabbit_pairs[i - 1] + rabbit_pairs[i - 2]
  4. 返回结果

    • 计算完成后,返回 rabbit_pairs[A],即第 A 个月末的兔子对数。

时间复杂度和空间复杂度

  • 时间复杂度:

    • 由于我们需要遍历从第 3 个月到第 A 个月,每次计算一个新的兔子对数,因此时间复杂度为 O(A),其中 A 是给定的月份数。
  • 空间复杂度:

    • 我们使用了一个大小为 A + 1 的数组来存储每个月的兔子对数,因此空间复杂度为 O(A)

边界情况

  1. A = 1

    • 第 1 个月末,兔子的对数是 1。
  2. A = 2

    • 第 2 个月末,兔子的对数是 2。
  3. A ≥ 3

    • 对于 A ≥ 3,我们使用递推公式逐月计算兔子对数。