题目解析
问题背景
小R正在研究兔子的繁殖模式。题目描述了一个特殊的兔子繁殖规律:
- 初始时有一对新生的小兔子。
- 每对成年兔子每个月会生育一对新的小兔子。
- 新生的小兔子需要一个月的时间才能成长为成年兔子,能够开始繁殖。
- 兔子永远不会死亡。
给定一个整数 A,表示月份数,要求我们计算在第 A 个月末,兔子的总对数。
解题思路
从题目描述来看,兔子的繁殖规律可以用递推关系表示,即每个月的兔子总数取决于前两个月的兔子数量。这是一个经典的 斐波那契数列 问题。
具体规则如下:
-
第 1 个月:只有 1 对兔子。
-
第 2 个月:原来的 1 对兔子变成成年兔子,开始繁殖,再加上新生的 1 对兔子,因此总共是 2 对兔子。
-
从第 3个月开始,每个月的兔子总数是:
F(n) = F(n-1) + F(n-2)这表示当前月的兔子对数是前两个月兔子对数的和,原因是:
- 当前月的兔子对数由上个月的兔子(成年兔子)和上上个月的兔子(已经长大并繁殖的新兔子)共同决定。
为了得到第 A 个月末的兔子总对数,可以利用动态规划的思想,逐月计算兔子对数。
解决步骤
-
初始化:
- 第 1 个月末兔子总对数为 1 对。
- 第 2 个月末兔子总对数为 2 对。
-
动态规划递推:
- 从第 3 个月开始,利用递推关系
F(n) = F(n-1) + F(n-2)计算兔子对数。
- 从第 3 个月开始,利用递推关系
-
存储结果:
- 我们使用一个数组
rabbit_pairs来存储每个月的兔子对数。数组的第i个元素表示第i个月末的兔子总对数。
- 我们使用一个数组
-
返回结果:
- 返回数组中第
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]
代码解析
-
初始化前两个月兔子对数:
- 如果
A == 1,说明我们查询的是第 1 个月,兔子总数为 1 对。 - 如果
A == 2,说明我们查询的是第 2 个月,兔子总数为 2 对。
- 如果
-
创建数组存储兔子对数:
- 创建一个大小为
A + 1的数组rabbit_pairs来存储每个月的兔子对数。 rabbit_pairs[i]表示第i个月末的兔子对数。
- 创建一个大小为
-
递推计算:
- 使用一个
for循环从第 3 个月开始,利用前两个月的兔子对数计算当前月的兔子对数。 - 递推公式是:
rabbit_pairs[i] = rabbit_pairs[i - 1] + rabbit_pairs[i - 2]。
- 使用一个
-
返回结果:
- 计算完成后,返回
rabbit_pairs[A],即第A个月末的兔子对数。
- 计算完成后,返回
时间复杂度和空间复杂度
-
时间复杂度:
- 由于我们需要遍历从第 3 个月到第
A个月,每次计算一个新的兔子对数,因此时间复杂度为O(A),其中A是给定的月份数。
- 由于我们需要遍历从第 3 个月到第
-
空间复杂度:
- 我们使用了一个大小为
A + 1的数组来存储每个月的兔子对数,因此空间复杂度为O(A)。
- 我们使用了一个大小为
边界情况
-
A = 1:- 第 1 个月末,兔子的对数是 1。
-
A = 2:- 第 2 个月末,兔子的对数是 2。
-
A ≥ 3:- 对于
A ≥ 3,我们使用递推公式逐月计算兔子对数。
- 对于