数据结构与算法之 leetcode 贪心算法分发饼干算法 排序后匹配

数据结构与算法阿木 发布于 2025-07-12 7 次阅读


摘要:

贪心算法是一种在每一步选择中都采取当前状态下最好或最优的选择,从而希望导致结果是全局最好或最优的算法策略。本文将以LeetCode上的“饼干分发问题”为例,深入解析贪心算法的原理,并给出详细的代码实现。

一、问题背景

LeetCode上的“饼干分发问题”描述如下:假设有n个孩子和m块饼干,每个孩子有一个最小饼干大小要求。你需要给每个孩子分配一块饼干,使得每个孩子得到的饼干大小至少满足其要求,且尽量满足更多孩子的要求。如何分配饼干,使得分配的饼干数量最少?

二、贪心算法原理

贪心算法的核心思想是在每一步选择中都采取当前状态下最好或最优的选择,从而希望导致结果是全局最好或最优的。对于饼干分发问题,我们可以采用以下贪心策略:

1. 将孩子按照最小饼干大小要求从小到大排序。

2. 将饼干按照大小从小到大排序。

3. 遍历孩子列表,对于每个孩子,从饼干列表中取出第一块满足其要求的饼干,并将其分配给该孩子。

4. 重复步骤3,直到所有孩子都得到饼干或饼干分配完毕。

三、代码实现

下面是使用Python实现的贪心算法解决饼干分发问题的代码:

python

def findContentChildren(g, s):


孩子最小饼干大小要求列表


children = sorted(g)


饼干大小列表


cookies = sorted(s)


分配饼干的数量


count = 0


遍历孩子列表


for i in range(len(children)):


遍历饼干列表


for j in range(len(cookies)):


如果饼干大小满足孩子要求,则分配饼干


if cookies[j] >= children[i]:


更新饼干列表,跳过已分配的饼干


cookies = cookies[:j] + cookies[j+1:]


更新分配饼干的数量


count += 1


跳过当前孩子,继续分配下一块饼干


break


return count

测试用例


g = [1, 2, 3]


s = [1, 1]


print(findContentChildren(g, s)) 输出:1


四、算法分析

1. 时间复杂度:O(nlogn),其中n为孩子的数量。排序孩子和饼干的时间复杂度均为O(nlogn),遍历孩子和饼干的时间复杂度均为O(n)。

2. 空间复杂度:O(1),除了输入的列表外,不需要额外的空间。

五、总结

本文以LeetCode上的“饼干分发问题”为例,介绍了贪心算法的原理和代码实现。通过贪心策略,我们可以以较优的时间复杂度解决实际问题。在实际应用中,我们需要根据具体问题选择合适的贪心策略,以达到最优解。