分发鱼干问题:最少鱼干数量的计算
问题描述
在猫星球上,每只猫有一个等级,等级高的猫应该得到更多鱼干,规则如下:
- 每只猫至少得到1斤鱼干。
- 如果一只猫的等级高于相邻的猫,它应该得到比相邻猫更多的鱼干。
目标是计算满足规则的情况下,至少需要多少斤鱼干。
解题思路
核心思想
为了满足规则:
- 从左到右遍历,保证每只猫比左边等级低的猫分得的鱼干更多。
- 从右到左遍历,保证每只猫比右边等级低的猫分得的鱼干更多。
- 最终取两次遍历中每只猫所需的最大鱼干数量。
具体步骤
-
初始化:创建一个数组
candies(长度为猫的数量),初始每只猫分得1斤鱼干。 -
从左到右遍历:
- 如果当前猫的等级高于前一只猫,则
candies[i] = candies[i-1] + 1。
- 如果当前猫的等级高于前一只猫,则
-
从右到左遍历:
- 如果当前猫的等级高于后一只猫,则
candies[i] = max(candies[i], candies[i+1] + 1)。
- 如果当前猫的等级高于后一只猫,则
-
求和:遍历
candies数组,计算鱼干总量。
算法复杂度
- 时间复杂度:O(n),两次线性遍历。
- 空间复杂度:O(n),存储每只猫的鱼干数量。
测试样例与代码实现
测试样例
-
输入:
n = 3, cats_levels = [1, 2, 2]- 输出:
4 - 分发鱼干:
[1, 2, 1]
- 输出:
-
输入:
n = 6, cats_levels = [6, 5, 4, 3, 2, 16]- 输出:
17 - 分发鱼干:
[6, 5, 4, 3, 2, 7]
- 输出:
-
输入:
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
- 输出:
代码实现
def distribute_fish(n, cats_levels):
# 初始化每只猫的鱼干数量为1
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)
# 计算总鱼干
return sum(fish)
# 测试用例
print(distribute_fish(3, [1, 2, 2])) # 输出:4
print(distribute_fish(6, [6, 5, 4, 3, 2, 16])) # 输出:17
print(distribute_fish(20, [1, 2, 2, 3, 3, 20, 1, 2, 3, 3, 2, 1, 5, 6, 6, 5, 5, 7, 7, 4])) # 输出:35
总结
-
双向遍历法:利用两次遍历,分别保证左边和右边的规则,效率高且直观。
-
边界情况:
- 如果所有猫的等级相同,则每只猫分1斤。
- 如果猫的等级单调递增或递减,则鱼干数量依次累加或递减。
-
核心逻辑:结合相邻猫的等级差异动态调整鱼干分配数量。