📅  最后修改于: 2023-12-03 15:40:28.207000             🧑  作者: Mango
本程序是为了解决下面这个问题而设计的:
有n个孩子站在一排,每个孩子都有一个评分。你要按照以下要求给孩子们分发糖果:
每个孩子都必须至少分配到一个糖果。 评分更高的孩子必须比他们的邻居得到更多的糖果。 最少需要准备多少颗糖果?
输入一个整数数组,表示每个孩子的评分。输出一个整数,表示最少需要准备多少颗糖果。如果输入参数不合法(如不是整数数组),会抛出异常。
def minimum_candies(scores: List[int]) -> int:
"""
根据给定条件分配给儿童所需的最少糖果数量
Args:
scores: 一个整数列表,表示每个孩子的成绩
Returns:
最少需要准备多少颗糖果
"""
if not isinstance(scores, list) or not all(isinstance(s, int) for s in scores):
raise TypeError('输入必须是整数列表')
n = len(scores)
candies = [1] * n
# 从左到右扫描一遍
for i in range(1, n):
if scores[i] > scores[i-1]:
candies[i] = candies[i-1] + 1
# 从右到左扫描一遍
for i in range(n-2, -1, -1):
if scores[i] > scores[i+1]:
candies[i] = max(candies[i], candies[i+1]+1)
return sum(candies)
如果只有一个孩子,那么他必然只需要1颗糖果。
否则,我们将糖果数量初始化为全1,也就是每个孩子都分配1颗糖果。接着,从左到右扫描一遍,如果发现当前孩子的成绩比左边的孩子高,那么他就应该比左边的孩子分配更多的糖果;否则,他只需要分配1颗糖果即可。
接下来,我们再从右到左扫描一遍,如果发现当前孩子的成绩比右边的孩子高,那么他就应该比右边的孩子分配更多的糖果。但是,这里还需要注意一点:我们需要保证不违反左边孩子分配糖果的规则。因此,我们需要取当前孩子分配的糖果数量和右边孩子分配的糖果数量加1之间的最大值。
最后,我们返回所有孩子分配的糖果数量之和即可。