问题描述 在猫星球上,小R负责给一行排队的猫分发鱼干。每只猫有一个等级,等级越高的猫应该得到更多的鱼干。规则如下: 每只猫至少得到一斤鱼干。 如果一只猫的等级高于它相邻的猫,它就应该得到比相邻的猫更多的鱼干。 小R想知道,为了公平地满足所有猫的等级差异,他至少需要准备多少斤鱼干。 测试样例 样例1: 输入:n = 3, cats_levels = [1, 2, 2] 输出:4 样例2: 输入:n = 6, cats_levels = [6, 5, 4, 3, 2, 16] 输出:17 样例3: 输入:n = 20, cats_levels = [1, 2, 2, 3, 3, 20, 1, 2, 3, 3, 2, 1, 5, 6, 6, 5, 5, 7, 7, 4] 输出:35
解题:
# 初始化每只猫至少得到一斤鱼干
fish = [1] * n
# 从左到右遍历,确保每只猫比左边的猫等级高时,得到更多的鱼干
for i in range(1, n):
if cats_levels[i] > cats_levels[i - 1]:
fish[i] = fish[i - 1] + 1
# 从右到左遍历,确保每只猫比右边的猫等级高时,得到更多的鱼干
for i in range(n - 2, -1, -1):
if cats_levels[i] > cats_levels[i + 1]:
fish[i] = max(fish[i], fish[i + 1] + 1)
# 计算总鱼干量
total_fish = sum(fish)
return total_fish
为了满足每只猫的等级和相邻等级的要求,必须确保:
- 每只猫至少得到一斤鱼干。
- 如果一只猫的等级高于它相邻的猫,它应该得到比相邻的猫更多的鱼干。
我们可以借鉴经典的“糖果”问题的解决方案,通过两次遍历(从左到右和从右到左)来确定每只猫应得的鱼干数量。
具体步骤:
-
初始化:
- 为每只猫分配至少一斤鱼干,因此初始化一个长度为
n的列表fish,所有元素均为1。
- 为每只猫分配至少一斤鱼干,因此初始化一个长度为
-
第一次遍历(从左到右) :
- 遍历猫的等级列表
cats_levels,从第二只猫开始(索引1)。 - 如果当前猫的等级高于左边的猫(
cats_levels[i] > cats_levels[i - 1]),则当前猫应得的鱼干数量为左边猫的鱼干数量加一(fish[i] = fish[i - 1] + 1)。 - 否则,保持当前鱼干数量为
1。
- 遍历猫的等级列表
-
第二次遍历(从右到左) :
- 再次遍历猫的等级列表
cats_levels,这次从倒数第二只猫开始(索引n - 2)。 - 如果当前猫的等级高于右边的猫(
cats_levels[i] > cats_levels[i + 1]),则当前猫应得的鱼干数量为右边猫的鱼干数量加一,并与当前鱼干数量取最大值(fish[i] = max(fish[i], fish[i + 1] + 1))。 - 否则,保持当前鱼干数量不变。
- 再次遍历猫的等级列表
-
计算总鱼干量:
- 最后,计算
fish列表中所有元素的和,即为最少需要准备的鱼干总斤数。
- 最后,计算
复杂度分析:
- 时间复杂度: O(n),其中 n 是猫的数量。需要进行两次遍历,每次遍历的时间复杂度为 O(n)。
- 空间复杂度: O(n),用于存储每只猫的鱼干数量。
注意事项:
- 等级相等的情况: 当两只相邻猫的等级相等时,没有鱼干分配的约束,可以保持鱼干数量为1。
- 单只猫: 如果只有一只猫,直接分配一斤鱼干。
- 边界条件: 确保输入的
cats_levels数组长度与n一致。