算法解释
顾名思义,贪心算法或贪心思想采用贪心的策略,保证每次操作都是局部最优的,从而使最后得到的结果是全局最优的。
举一个最简单的例子:小明和小王喜欢吃苹果,小明可以吃五个,小王可以吃三个。已知苹果园里有吃不完的苹果,求小明和小王一共最多吃多少个苹果。在这个例子中,我们可以选用的贪心策略为,每个人吃自己能吃的最多数量的苹果,这在每个人身上都是局部最优的。又因为全局结果是局部结果的简单求和,且局部结果互不相干,因此局部最优的策略也同样是全局最优的。
证明一道题能用贪心算法解决,有时远比用贪心算法解决该题更复杂。一般情况下,在简单操作后,具有明显的从局部到整体的递推关系,或者可以通过数学归纳法推测结果时,我们才会使用贪心算法。
分配问题
455. Assign Cookies
因为饥饿度最小的孩子最容易吃饱,所以我们先考虑这个孩子。为了尽量使得剩下的饼干可以满足饥饿度更大的孩子,所以我们应该把大于等于这个孩子饥饿度的、且大小最小的饼干给这个孩子。
对数组或字符串排序是常见的操作,方便之后的大小比较,排序顺序默认是从小到大。在之后的讲解中,若我们谈论的是对连续空间的变量进行操作,我们并不会明确区分数组和字符串,因为他们本质上都是在连续空间上的有序变量集合。一个字符串 “abc” 可以被看作一个数组 [“a”, “b”, “c”]。
135. Candy
存在比较关系的贪心策略并不一定需要排序。这里的贪心策略即为,在每次遍历中,只考虑并更新相邻一侧的大小关系。
区间问题
435. Non-overlapping Intervals
求最少的移除区间个数,等价于尽量多保留不重叠的区间。选择的区间结尾越小,余留给其它区间的空间就越大,就越能保留更多的区间。因此,我们采取的贪心策略为,优先保留结尾小且不相交的区间。
需要根据实际情况判断按区间开头排序还是按区间结尾排序。
练习
605. Can Place Flowers
采取什么样的贪心策略,可以种植最多的花朵呢?
452. Minimum Number of Arrows to Burst Balloons
这道题和 435. Non-overlapping Intervals 十分类似,但是稍有不同,具体是哪里不同呢?
763. Partition Labels
为了满足你的贪心策略,是否需要一些预处理?
在处理数组前,统计一遍信息(如频率、个数、第一次出现位置、最后一次出现位置等)可以使题目难度大幅降低。
122. Best Time to Buy and Sell Stock II
股票交易题型里比较简单的题目,在不限制交易次数的情况下,怎样可以获得最大利润呢?
406. Queue Reconstruction by Height
温馨提示,这道题可能同时需要排序和插入操作。
665. Non-decreasing Array
需要仔细思考你的贪心策略在各种情况下,是否仍然是最优解。