问题描述
在猫星球上,小R负责给一行排队的猫分发鱼干。每只猫有一个等级,等级越高的猫应该得到更多的鱼干。规则如下:
- 每只猫至少得到一斤鱼干。
- 如果一只猫的等级高于它相邻的猫,它就应该得到比相邻的猫更多的鱼干。
小R想知道,为了公平地满足所有猫的等级差异,他至少需要准备多少斤鱼干。
思路分析
初始化每只猫的鱼干数量,都为一斤鱼干
判断当前猫的等级是否高于相邻的两只猫,若高于相邻的猫,则在基础上再加一斤鱼干。
算法步骤
- 初始化:首先,每只猫至少得到1斤鱼干,所以我们可以初始化一个数组
fish,其中每个元素初始值为1。 - 从左到右遍历:从左到右遍历猫的等级,如果当前猫的等级高于前一只猫的等级,那么当前猫的鱼干数量应该比前一只猫多1。
- 从右到左遍历:从右到左遍历猫的等级,确保如果当前猫的等级高于后一只猫的等级,那么当前猫的鱼干数量应该比后一只猫多1。这里需要使用
max函数来确保鱼干数量满足条件。 - 计算总和:最后,计算所有猫的鱼干总和,即为所需的最少鱼干数量。
代码实现
def solution(n, cats_levels):
# Please write your code here
# 初始化每只猫的鱼干数量,初始为1
fish = [1] * n
# 从左到右遍历猫的等级
for i in range(1, n):
if cats_levels[i] > cats_levels[i - 1]:
fish[i] = fish[i - 1] + 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)
# return -1
if __name__ == "__main__":
# You can add more test cases here
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)
print(solution(6, cats_levels2) == 17)
print(solution(20, cats_levels3) == 35)
知识总结
这道题目可以归类为“分配问题”,涉及数组的动态变化和条件判断。 用于解决猫分配鱼干的问题的核心思想是:
-
初始分配:每只猫至少得到1斤鱼干。
-
前后比较:通过两次遍历(一次从左到右,一次从右到左)来调整鱼干的分配,确保对每只猫的等级差异满足条件。
- 从左到右遍历时,比较当前猫与前一只猫的等级,若当前等级高,则其鱼干要比前一只猫多1斤。
- 从右到左遍历时,确保避免因为前面的调整而影响到当前猫的鱼干数量。通过
max函数来取更大的鱼干值,从而满足条件。
学习建议:
- 掌握动态规划:虽然这个问题不像传统的动态规划那样复杂,但理解如何通过状态转移(在此例中根据鱼干数量的调整)来解决问题是很重要的。
- 练习双指针技巧:这道题实际上使用了类似双指针的思路,通过两个不同的方向遍历数组来更新鱼干的分配。可以多练习一些双指针题。