|
题目 n个孩子站成一排,给你一个整数数组ratings表示每个孩子的评分。你需要按照以下要求,给这些孩子分发糖果。 (1)每个孩子至少分配到1个糖果。 (2)相邻两个孩子评分更高的孩子会获得更多的糖果。 请你给每个孩子分发糖果,计算并返回需要准备的最少糖果数目。 示例1:输入:ratings=[1,0,2]输出:5解释:你可以分别给第一个、第二个、第三个孩子分发2、1、2颗糖果。 示例2:输入:ratings=[1,2,2]输出:4解释:你可以分别给第一个、第二个、第三个孩子分发1、2、1颗糖果。第三个孩子只得到1颗糖果,这满足题面中的两个条件。贪心算法 本题最直观的解法是:使用两次遍历的贪心算法。第一次遍历:从左到右,保证每个孩子至少有一颗糖果,并且如果当前孩子评分比左边孩子高,则当前孩子至少比左边孩子多一颗糖果。第二次遍历:从右到左,再次检查每个孩子,确保如果当前孩子评分比右边孩子高,也能得到比右边孩子多的糖果。使用贪心算法求解本题的主要步骤如下。 1、初始化一个结果数组,每个位置初始化为1,表示每个孩子至少有一颗糖果。 2、从左到右遍历,如果当前孩子的评分比前一个孩子高,则在结果数组中,当前孩子的糖果数比前一个孩子多1。 3、从右到左遍历,重复步骤2的逻辑,这样可以确保每个孩子根据其两边的比较都能得到正确的糖果数。 4、计算结果数组中所有糖果数的总和。 根据上面的算法步骤,我们可以得出下面的示例代码。defdistribute_candies_greedy(ratings):n=len(ratings)ifn==0:return0#初始化糖果数组,每个孩子至少一个糖果candies=[1]*n#从左到右遍历,保证评分高的孩子糖果比左边多foriinrange(1,n):ifratings[i]>ratings[i-1]:candies[i]=candies[i-1]+1#从右到左遍历,确保糖果分配满足所有条件foriinrange(n-2,-1,-1):ifratings[i]>ratings[i+1]andcandies[i]
|
|