返回

巧妙分糖:用耐心换取公平(附步步攻略)

前端

孩子们的欢笑声常常点亮我们的生活,但当我们面对分糖果这样一件看似简单的小事时,却也可能隐藏着不少难题。今天,我们就将聚焦一道来自 LeetCode 的难题——「135. 分发糖果」,探索如何公平地给孩子们分发糖果,让他们每个人都感受到快乐。

前提:耐心是关键

在开始之前,我们要强调一个重要的原则:耐心是分糖果的关键。不要急于将糖果分发完毕,而是要沉下心,按照既定的策略一步步进行。只有这样,才能保证分发过程的公平公正,让每一个孩子都得到他们应得的糖果。

思路:贪心算法

解决「135. 分发糖果」难题,我们可以采用贪心算法。贪心算法是一种在每一步做出局部最优选择,从而得到全局最优解的算法。在这个问题中,我们的目标是让每个孩子都尽可能多地得到糖果,因此我们的局部最优选择就是:在当前步骤,给评分较高的孩子分发更多的糖果

分步攻略

现在,让我们一步步深入探索糖果分发过程:

步骤 1:初始化

首先,我们需要初始化两个数组:ratingscandiesratings 数组存储每个孩子的评分,而 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. 分发糖果」难题可以得到巧妙且公平的解决。记住,耐心是分糖果的关键,贪心算法为我们提供了局部最优选择,而分步攻略则确保了我们能够全局最优地解决问题。希望这篇文章能帮助你深入理解分糖果背后的奥秘,并在未来的分糖果挑战中游刃有余。