巧妙分糖:用耐心换取公平(附步步攻略)
2023-11-24 06:27:42
孩子们的欢笑声常常点亮我们的生活,但当我们面对分糖果这样一件看似简单的小事时,却也可能隐藏着不少难题。今天,我们就将聚焦一道来自 LeetCode 的难题——「135. 分发糖果」,探索如何公平地给孩子们分发糖果,让他们每个人都感受到快乐。
前提:耐心是关键
在开始之前,我们要强调一个重要的原则:耐心是分糖果的关键。不要急于将糖果分发完毕,而是要沉下心,按照既定的策略一步步进行。只有这样,才能保证分发过程的公平公正,让每一个孩子都得到他们应得的糖果。
思路:贪心算法
解决「135. 分发糖果」难题,我们可以采用贪心算法。贪心算法是一种在每一步做出局部最优选择,从而得到全局最优解的算法。在这个问题中,我们的目标是让每个孩子都尽可能多地得到糖果,因此我们的局部最优选择就是:在当前步骤,给评分较高的孩子分发更多的糖果 。
分步攻略
现在,让我们一步步深入探索糖果分发过程:
步骤 1:初始化
首先,我们需要初始化两个数组:ratings
和 candies
。ratings
数组存储每个孩子的评分,而 candies
数组则存储每个孩子目前得到的糖果数。
步骤 2:从左到右遍历
从左到右遍历 ratings
数组,对于每个孩子,我们进行以下操作:
- 如果该孩子的评分比左边的孩子高,那么他至少应该得到比左边孩子多一颗糖果。
- 如果该孩子的评分与左边的孩子相同,那么他至少应该得到与左边孩子相同数量的糖果。
步骤 3:从右到左遍历
完成从左到右的遍历后,我们再从右到左遍历 ratings
数组,对于每个孩子,我们进行以下操作:
- 如果该孩子的评分比右边的孩子高,那么他至少应该得到比右边孩子多一颗糖果。
- 如果该孩子的评分与右边的孩子相同,那么他至少应该得到与右边孩子相同数量的糖果。
步骤 4:分配糖果
通过以上遍历,我们得到了每个孩子应得到的最小糖果数。现在,我们可以根据这些最小糖果数来分配实际的糖果数量。
步骤 5:输出结果
最后,我们将 candies
数组作为输出结果,其中每个元素代表每个孩子得到的糖果数量。
代码示例
以下是用 Python 实现的代码示例:
def distribute_candies(ratings):
n = len(ratings)
candies = [1] * n
# 从左到右遍历
for i in range(1, n):
if ratings[i] > ratings[i - 1]:
candies[i] = candies[i - 1] + 1
# 从右到左遍历
for i in range(n - 2, -1, -1):
if ratings[i] > ratings[i + 1]:
candies[i] = max(candies[i], candies[i + 1] + 1)
return candies
实例
假设我们有以下孩子评分数组:
ratings = [1, 2, 2, 3, 1]
按照上述分步攻略,我们可以得到以下糖果分配结果:
candies = [1, 2, 2, 3, 1]
总结
通过采用贪心算法和分步攻略,「135. 分发糖果」难题可以得到巧妙且公平的解决。记住,耐心是分糖果的关键,贪心算法为我们提供了局部最优选择,而分步攻略则确保了我们能够全局最优地解决问题。希望这篇文章能帮助你深入理解分糖果背后的奥秘,并在未来的分糖果挑战中游刃有余。