1. 贪心算法基础与解题思路
贪心算法(Greedy Algorithm)是一种在每一步选择中都采取当前状态下最优决策的算法策略。它不像动态规划那样考虑全局最优解,而是通过局部最优的选择,希望最终达到全局最优。这种算法思想特别适合解决一些具有"最优子结构"特性的问题。
1.1 贪心算法的核心特征
贪心算法有效的三个关键条件:
-
贪心选择性质:每一步的局部最优选择能导致全局最优解。这意味着我们不需要回溯或重新考虑之前的选择。
-
最优子结构:问题的最优解包含其子问题的最优解。这与动态规划类似,但贪心算法不需要保存子问题的解。
-
无后效性:某个状态以前的过程不会影响以后的状态,只与当前状态有关。
在实际应用中,贪心算法常用于解决:
- 分配问题(如分发饼干)
- 区间调度问题
- 最短路径问题
- 数据压缩(如霍夫曼编码)
1.2 贪心算法的解题步骤
- 问题转化:将原问题分解为若干子问题
- 贪心策略:确定在每个子问题中做出选择的准则
- 证明有效性:证明该策略确实能得到全局最优解
- 算法实现:根据策略编写代码实现
注意:贪心算法并不总是能得到最优解,因此在应用前必须确认问题的特性是否适合贪心策略。当不确定时,可以通过举反例来验证策略的正确性。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 分发饼干问题解析(455题)
2.1 问题重述与理解
题目描述:假设你是一位家长,要给孩子们分发饼干。每个孩子i有一个胃口值g[i],每块饼干j的尺寸为s[j]。只有当饼干尺寸≥孩子胃口时,孩子才能得到满足。目标是尽可能满足更多的孩子。
示例:
- 输入:g = [1,2,3], s = [1,1]
- 输出:1
- 解释:只能满足胃口为1的孩子
2.2 贪心策略分析
这个问题可以抽象为一个匹配问题,我们需要找到最多的(g[i], s[j])对,其中s[j] ≥ g[i]。为了使满足的孩子数量最大化,我们需要考虑以下两种策略:
- 小饼干优先:将最小的饼干分配给能满足的最小胃口的孩子
- 大饼干优先:将最大的饼干分配给能满足的最大胃口的孩子
经过分析,两种策略都能得到最优解,但实现方式不同。我们选择"大饼干优先"策略,因为:
- 大饼干能覆盖更多可能性
- 排序后可以从数组尾部开始匹配,实现更直观
2.3 详细实现步骤
- 排序数组:将g和s数组分别排序
- 双指针初始化:index指向最大的饼干,i指向最大的胃口
- 贪心匹配:
- 如果当前饼干能满足当前胃口,计数+1,两个指针都前移
- 否则只移动胃口指针(尝试用当前饼干满足更小的胃口)
- 终止条件:任一数组遍历完成
cpp复制class
