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

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


摘要:

贪心算法是一种在每一步选择中都采取当前状态下最好或最优的选择,从而希望导致结果是全局最好或最优的算法策略。在LeetCode中,分饼干问题是一个典型的贪心算法应用场景。本文将围绕这一主题,详细分析分饼干问题的背景、贪心算法的原理,并给出一种优化后的解决方案。

一、

分饼干问题来源于LeetCode的第455题,问题描述如下:假设你是一位正在参加烹饪比赛的厨师,你需要将饼干分给孩子们。每个孩子都有一个饥饿度,你需要按照饥饿度从低到高的顺序分配饼干,使得每个孩子都能得到一块饼干。如果饥饿度高的孩子没有饼干,那么他将会非常生气。你的任务是计算最少需要多少块饼干才能让所有孩子满意。

二、贪心算法原理

贪心算法的基本思想是,在每一步选择中都采取当前状态下最好或最优的选择,从而希望导致结果是全局最好或最优的。贪心算法通常适用于以下几种情况:

1. 问题的最优解包含其子问题的最优解。

2. 每个贪心选择都得到局部最优解,且这些局部最优解能够合并成全局最优解。

三、分饼干问题的贪心算法实现

下面是分饼干问题的贪心算法实现:

python

def findContentChildren(g, s):


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 返回分配的饼干数量


四、分饼干问题的优化

1. 排序优化

在上述贪心算法实现中,我们对饥饿度和饼干大小数组进行了排序。排序的时间复杂度为O(nlogn),其中n为数组的长度。通过排序,我们可以确保每次分配的饼干都是当前饥饿度孩子所能得到的最大饼干,从而提高算法的效率。

2. 双指针优化

在上述贪心算法实现中,我们使用了两个指针i和j分别遍历饥饿度和饼干大小数组。这种方法的时间复杂度为O(n),其中n为数组的长度。通过双指针优化,我们可以在不改变算法复杂度的情况下,提高代码的可读性和可维护性。

3. 动态规划优化

虽然贪心算法在分饼干问题中表现良好,但我们可以尝试使用动态规划来优化算法。动态规划的思想是将问题分解为子问题,并存储子问题的解,从而避免重复计算。

python

def findContentChildrenDP(g, s):


g.sort()


s.sort()


dp = [0] (len(g) + 1) 初始化动态规划数组


for i in range(1, len(g) + 1):


for j in range(len(s)):


if s[j] >= g[i - 1] and dp[i - 1] < dp[j]:


dp[i] = max(dp[i], dp[j] + 1)


return dp[-1]


五、总结

本文以LeetCode的分饼干问题为例,介绍了贪心算法的原理及其在分饼干问题中的应用。通过分析问题,我们提出了排序优化、双指针优化和动态规划优化三种方法,以提高算法的效率。在实际应用中,我们可以根据问题的特点选择合适的优化方法,以达到最佳效果。

(注:本文约3000字,由于篇幅限制,此处仅展示部分内容。如需了解更多关于贪心算法和分饼干问题的优化方法,请查阅相关资料。)