返回

平等分糖:让每个孩子都高兴起来

前端

分配糖果的公平原则

在一个由 n 个孩子组成的队列中,每个孩子都有一个评分 ratings[i]。公平分配糖果意味着遵循以下原则:

  • 每个孩子都应该至少得到一颗糖果。
  • 如果一个孩子的评分比相邻的孩子高,那么该孩子应该得到更多的糖果。

贪心算法解决方案

为了解决这个糖果分配问题,我们采用贪心算法:

  1. 初始化一个数组 candies,其中每个元素最初都是 1。这表示每个孩子都至少得到一颗糖果。

  2. 从左到右遍历评分数组 ratings:

    • 如果当前孩子的评分高于前一个孩子,则 candies[i] = candies[i-1] + 1。
    • 否则,保持 candies[i] 不变。
  3. 从右到左再次遍历评分数组 ratings,执行类似步骤:

    • 如果当前孩子的评分高于后一个孩子,则 candies[i] = max(candies[i], candies[i+1] + 1)。
    • 否则,保持 candies[i] 不变。

算法示例

考虑以下示例:

ratings = [1, 5, 2, 1, 2]

算法执行如下:

  • 从左到右遍历:candies = [1, 2, 1, 1, 1]
  • 从右到左遍历:candies = [1, 2, 2, 2, 2]

最终结果:

  • candies = [1, 2, 2, 2, 2]

在这个分配中,每个孩子都得到了一颗糖果,并且相邻评分更高的孩子得到了更多的糖果,满足了公平分配原则。

代码实现

def distribute_candy(ratings):
  # 初始化糖果分配
  candies = [1] * len(ratings)

  # 从左到右遍历,计算评分更高的相邻孩子的糖果数
  for i in range(1, len(ratings)):
    if ratings[i] > ratings[i-1]:
      candies[i] = candies[i-1] + 1

  # 从右到左遍历,计算评分更高的相邻孩子的糖果数
  for i in range(len(ratings)-2, -1, -1):
    if ratings[i] > ratings[i+1]:
      candies[i] = max(candies[i], candies[i+1] + 1)

  return candies

结论

通过使用贪心算法,我们可以有效地分配糖果,确保每个孩子都得到至少一颗糖果,并且相邻评分更高的孩子得到更多的糖果。这种算法简单易懂,并且能够快速且准确地解决分配糖果的问题。