在给定的猫等级列表中,我们需要确保每只猫根据相邻猫的等级差异,公平地分配鱼干。我们的目标是:
- 每只猫至少得到一斤鱼干。
- 如果一只猫的等级高于相邻的猫,它应该得到比相邻猫更多的鱼干。
为了实现这一目标,我们采用贪心算法的策略,通过两次遍历来调整鱼干的分配:
- 从左到右遍历:确保每只猫如果等级高于左邻猫,则它的鱼干多于左邻猫。
- 从右到左遍历:确保每只猫如果等级高于右邻猫,则它的鱼干多于右邻猫。
- 最后,计算所有猫鱼干的总和。
图解
假设我们有以下猫等级列表:
Copy Code
猫等级: [1, 2, 2, 3, 3, 2, 4]
第一步:左到右遍历
-
初始鱼干分配:[1, 1, 1, 1, 1, 1, 1]
-
遍历过程:
- 比较猫1和猫2:等级提高,猫2分配2斤,结果:[1, 2, 1, 1, 1, 1, 1]
- 比较猫2和猫3:等级不变,分配不变,结果:[1, 2, 1, 1, 1, 1, 1]
- 比较猫3和猫4:猫4等级提高,分配3斤,结果:[1, 2, 1, 2, 1, 1, 1]
- 猫5和猫6等级相同,分配不变,结果:[1, 2, 1, 2, 1, 1, 1]
- 比较猫6和猫7:猫7等级提高,分配2斤,结果:[1, 2, 1, 2, 1, 2, 1]
经过左到右遍历后的结果是:[1, 2, 1, 2, 1, 2, 1]
第二步:右到左遍历
-
从右到左遍历调整:
- 比较猫6和猫5:猫6等级高于猫5,分配调整为2斤,结果:[1, 2, 1, 2, 2, 2, 1]
- 比较猫5和猫4:分配不变,结果:[1, 2, 1, 2, 2, 2, 1]
- 比较猫4和猫3:分配不变,结果:[1, 2, 1, 2, 2, 2, 1]
- 比较猫3和猫2:分配不变,结果:[1, 2, 1, 2, 2, 2, 1]
- 比较猫2和猫1:分配不变,结果:[1, 2, 1, 2, 2, 2, 1]
最终的分配结果是:[1, 2, 1, 2, 2, 2, 1]。
代码详解
pythonCopy Code
def solution(n, cats_levels):
# 每只猫初始分配一斤鱼干
fish_distribution = [1] * n
# 从左到右遍历
for i in range(1, n):
if cats_levels[i] > cats_levels[i - 1]:
fish_distribution[i] = fish_distribution[i - 1] + 1
# 从右到左遍历
for i in range(n - 2, -1, -1):
if cats_levels[i] > cats_levels[i + 1]:
fish_distribution[i] = max(fish_distribution[i], fish_distribution[i + 1] + 1)
# 计算总分配的鱼干数量
total_fish = sum(fish_distribution)
return total_fish
if __name__ == "__main__":
cats_levels1 = [1, 2, 2]
cats_levels2 = [6, 5, 4, 3, 2, 16]
cats_levels3 = [1, 2, 2, 3, 3, 20, 1, 2, 3, 3, 2, 1, 5, 6, 6, 5, 5, 7, 7, 4]
print(solution(3, cats_levels1) == 4) # True
print(solution(6, cats_levels2) == 17) # True
print(solution(20, cats_levels3) == 35) # True
代码解释
-
初始化分配:创建一个与猫数量相同的列表
fish_distribution,每个元素初始化为1,表示每只猫至少得到一斤鱼干。 -
左到右遍历:
- 从第二只猫开始遍历,如果当前猫的等级高于左边的猫,更新当前猫的鱼干数量。
-
右到左遍历:
- 从倒数第二只猫开始遍历,进行类似的比较和更新,确保符合相邻猫的分配规则。
-
计算总和:最后,使用
sum()函数计算并返回所有猫的鱼干总量。
这种方法时间复杂度为O(n),因为我们只遍历两次猫的列表,效率很高。