贪心算法又称为贪婪算法(greedy algorithm),是指在对问题求解时,总是做出在当前看来是最好的选择。也就是说,它期望通过局部最优选择从而得到全局最优的解决方案。 贪心本质 贪心算法并不是从整体最优考虑,它所做出的选择只是在某种意义上的局部最优。贪心算法能得到许多问题的整体最优解或整体最优解的近似解。贪心算法中,我们一旦做出选择,就不能反悔,而且最终得到的不一定是最优解,而是最优解的近似解,选择什么样的贪心策略,直接决定算法的好坏。 重要特性 利用贪心算法求解的问题往往应该具备以下两个重要的特性: 1. 贪心选择性质 所谓贪心选择性质是指原问题的整体最优解可以通过一系列局部最优的选择得到。应用同一规则,将原问题变为一个相似的但规模更小的子问题,而后的每一步都是当前最佳的选择。这种选择依赖于已做出的选择,但不依赖于未做出的选择。运用贪心策略解决的问题在程序的运行过程中无回溯过程。 2. 最优子结构性质 当一个问题的最优解包含其子问题的最优解时,称此问题具有最优子结构性质。问题的最优子结构性质是该问题是否可用贪心算法求解的关键。至于采用什么样的贪心选择性质是要根据具体题目具体分析得来的。 贪心算法解题策略 (1)贪心策略 首先要确定贪心策略,选择当前看上去最好的一个方案。 (2)局部最优解 根据贪心策略,一步一步地得到局部最优解。 (3)全局最优解 把所有的局部最优解合成为原来问题的一个最优解。 贪心算法解题基本思路 (1)建立数学模型来描述问题; (2)把求解的问题分成若干个子问题; (3)对每一子问题求解,得到子问题的局部最优解; (4)把子问题的解局部最优解合成原来解问题的一个解。 贪心算法存在的缺陷 (1)不能保证解是最佳的。因为贪心算法总是从局部出发,并没从整体考虑; (2)贪心算法一般用来解决求最大或最小解; (3)贪心算法只能确定某些问题的可行性范围。 贪心算法相关LeetCode例题 (点击题目名称,跳转至对应题目分析) 分配相关贪心策略 LeetCode 455.分发饼干(Easy) 贪心策略:给剩余孩子中最小胃口值的孩子分配最小的能满足孩子胃口值的饼干。 LeetCode 135.分发糖果(Hard) 贪心策略:分发糖果时只考虑更新相邻一侧的大小关系。 区间相关贪心策略 LeetCode 435.无重叠区间(Medium) 贪心策略:优先保留结尾最小且和前一个选择区间不重叠的区间。 LeetCode 452.用最少数量的箭引爆气球(Medium) 贪心策略:用箭引爆当前气球时,能把其他气球区间与当前气球区间重叠的气球一起引爆。 LeetCode 122.买卖股票的最佳时机II(Easy) 贪心策略:只要股价区间递增,即股价上涨,就取当前股价差值做为我们获得的利润。 LeetCode 665.非递减数列(Easy) 贪心策略:瞻前顾后,考虑当前元素和左右相邻元素,找出使数列递增的元素进行更改,判断更改次数。 LeetCode 763.划分字母区间(Medium) 贪心策略:找出每个字母最后出现的位置,遍历字符串,找出出现同个字母在同一片段的最大区间。 其他贪心策略 LeetCode 605.种花问题(Easy) 贪心策略:把能种下花的花坛全都种下花。 LeetCode 406.根据身高重建队列(Medium) 贪心策略:身高高的一定排在前面,身高一样的将前面高于自己人数小的人放在前面。 |
|