返回

LeetCode 135:分发糖果——你给出去的是糖果,收回来的是成长

Android

写在前面:糖果的魅力

糖果,一种小小的甜食,却能带给人们无限的欢乐。它不仅能满足我们的味蕾,还能抚慰我们的心灵。在孩子的世界里,糖果更是不可或缺的存在。无论是过生日、过节,还是考试得了高分,都能收到糖果作为奖励。糖果,就像是一种神奇的魔法,能瞬间让孩子们的笑脸绽放。

而糖果不仅能带来欢乐,它还是一种爱的表达。当我们把糖果分给孩子时,其实也是在向他们传递我们的爱和关怀。每一颗糖果,都代表着我们的心意。

LeetCode 135:分发糖果

今天,我们要解决的问题是 LeetCode 135:分发糖果。这是一个经典的动态规划问题,非常适合初学者学习。在这个问题中,我们有一个评分数组,表示每个孩子的评分。我们的任务是根据这个数组,为每个孩子分配糖果,使相邻的孩子中,评分高的孩子获得更多的糖果。

解决方法:动态规划

这个问题可以使用动态规划的方法来解决。动态规划是一种自底向上的算法设计方法,它将问题分解成一系列的子问题,然后逐个解决这些子问题,最后将子问题的解组合起来得到原问题的解。

在这个问题中,我们可以定义一个状态数组 dp,其中 dp[i] 表示第 i 个孩子的糖果数量。我们从后往前遍历这个数组,对于每一个孩子,我们先比较他与前一个孩子的评分,如果他的评分更高,我们就将他的糖果数量设为前一个孩子的糖果数量加一;否则,我们就将他的糖果数量设为 1。

通过这种方式,我们就可以为每个孩子分配糖果,使相邻的孩子中,评分高的孩子获得更多的糖果。

示例:

给定一个评分数组 [1, 3, 2, 2, 1],我们需要为每个孩子分配糖果,使相邻的孩子中,评分高的孩子获得更多的糖果。

def distribute_candies(ratings):
  """
  :type ratings: List[int]
  :rtype: List[int]
  """
  n = len(ratings)
  dp = [1] * n

  for i in range(1, n):
    if ratings[i] > ratings[i - 1]:
      dp[i] = dp[i - 1] + 1

  for i in range(n - 2, -1, -1):
    if ratings[i] > ratings[i + 1]:
      dp[i] = max(dp[i], dp[i + 1] + 1)

  return dp

调用 distribute_candies([1, 3, 2, 2, 1]),得到结果 [1, 2, 1, 2, 1]

总结

LeetCode 135:分发糖果是一个经典的动态规划问题,非常适合初学者学习。通过这道题,我们可以学习到动态规划的基本思想和解题方法。希望大家能够举一反三,将动态规划应用到其他问题中。