返回

用贪心算法解决 LeetCode 第 455 题:分发饼干

前端

在 LeetCode 中,第 455 题:“分发饼干”是一道贪心算法问题。它考验了您利用有限资源(饼干)满足不同需求(孩子的胃口)的能力。

问题

您是一位心怀善意的家长,希望用小饼干满足孩子们的胃口。然而,每个孩子最多只能吃一块饼干。每个孩子 i 有一个胃口值 g[i],表示能让孩子满足的最小饼干大小。另一方面,您有 n 块饼干,每个饼干 j 都有一个大小 s[j]。

您的目标是确定是否可以分发饼干,使得每个孩子至少有一块饼干可以满足他们的胃口。

解决方法:贪心算法

此问题的最佳解决方法是使用贪心算法。贪心算法在每一步中做出看似最佳的选择,希望最终导致整体最优解。在“分发饼干”中,我们的贪心策略如下:

  1. 按胃口值对孩子排序: 将孩子按胃口值升序排序,这样胃口最小的孩子将排在最前面。
  2. 按大小对饼干排序: 将饼干按大小升序排序,这样最小的饼干将排在最前面。
  3. 贪心分配: 从排队的开头开始,为每个孩子分配最小的饼干,前提是该饼干的大小满足孩子的胃口。
  4. 检查可行性: 如果每个孩子都分配到一块满足其胃口的饼干,则返回 true;否则,返回 false。

示例

假设我们有以下输入:

孩子胃口:g = [1, 2, 3]
饼干大小:s = [1, 2]

按照上述贪心策略,我们可以按以下步骤分配饼干:

  1. 按胃口值对孩子排序:g = [1, 2, 3]
  2. 按大小对饼干排序:s = [1, 2]
  3. 分配:
    • 第 1 个孩子(胃口为 1)获得大小为 1 的饼干。
    • 第 2 个孩子(胃口为 2)获得大小为 2 的饼干。
  4. 检查可行性: 每个孩子都得到了一块满足其胃口的饼干,因此返回 true。

代码实现

使用 Python 实现贪心算法如下:

def can_distribute_cookies(g, s):
  """
  :type g: List[int]
  :type s: List[int]
  :rtype: bool
  """
  # 排序孩子和饼干
  g.sort()
  s.sort()

  # 贪心分配
  i, j = 0, 0
  while i < len(g) and j < len(s):
    if s[j] >= g[i]:
      i += 1
    j += 1

  # 检查可行性
  return i == len(g)

复杂度分析

时间复杂度:O(n log n),其中 n 是孩子和饼干的数量,因为需要对两个数组进行排序。

空间复杂度:O(1),因为我们没有使用额外的空间。

结论

通过使用贪心算法,我们可以有效地解决 LeetCode 第 455 题:“分发饼干”。通过按胃口对孩子排序并按大小对饼干排序,我们可以贪心地分配饼干以满足每个孩子的胃口。