返回
用贪心算法解决 LeetCode 第 455 题:分发饼干
前端
2023-10-16 01:08:34
在 LeetCode 中,第 455 题:“分发饼干”是一道贪心算法问题。它考验了您利用有限资源(饼干)满足不同需求(孩子的胃口)的能力。
问题
您是一位心怀善意的家长,希望用小饼干满足孩子们的胃口。然而,每个孩子最多只能吃一块饼干。每个孩子 i 有一个胃口值 g[i],表示能让孩子满足的最小饼干大小。另一方面,您有 n 块饼干,每个饼干 j 都有一个大小 s[j]。
您的目标是确定是否可以分发饼干,使得每个孩子至少有一块饼干可以满足他们的胃口。
解决方法:贪心算法
此问题的最佳解决方法是使用贪心算法。贪心算法在每一步中做出看似最佳的选择,希望最终导致整体最优解。在“分发饼干”中,我们的贪心策略如下:
- 按胃口值对孩子排序: 将孩子按胃口值升序排序,这样胃口最小的孩子将排在最前面。
- 按大小对饼干排序: 将饼干按大小升序排序,这样最小的饼干将排在最前面。
- 贪心分配: 从排队的开头开始,为每个孩子分配最小的饼干,前提是该饼干的大小满足孩子的胃口。
- 检查可行性: 如果每个孩子都分配到一块满足其胃口的饼干,则返回 true;否则,返回 false。
示例
假设我们有以下输入:
孩子胃口:g = [1, 2, 3]
饼干大小:s = [1, 2]
按照上述贪心策略,我们可以按以下步骤分配饼干:
- 按胃口值对孩子排序:g = [1, 2, 3]
- 按大小对饼干排序:s = [1, 2]
- 分配:
- 第 1 个孩子(胃口为 1)获得大小为 1 的饼干。
- 第 2 个孩子(胃口为 2)获得大小为 2 的饼干。
- 检查可行性: 每个孩子都得到了一块满足其胃口的饼干,因此返回 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 题:“分发饼干”。通过按胃口对孩子排序并按大小对饼干排序,我们可以贪心地分配饼干以满足每个孩子的胃口。