文章目录
概论
贪心问题是算法中相当困难的部分,因为一般的算法往往有通用的模板,方便我们理解,但贪心不仅没有模板,也没有通用套路,更倾向于是一种思想。
那么如果一个编程初学者,需要快速了解贪心,有可能吗?
当然还是可以的,但还是推荐先把基础的算法搞懂再来升级打怪,本篇文章可以先放在收藏夹里吃灰 。
那么如果真的需要快速学会贪心算法,本文将从贪心的基本思想,基础题型,经典例题,全方位为你的速通服务。
能力有限,如有不当之处欢迎讨论区交流。
基本思想
贪心算法其实是动态规划的一种,在特定情况下,删去动态规划的一些不必要的遍历和穷举。
所以如果搞不懂可以都用dp。
dp还是有套路可言的,按照套路带入题可以轻松解决绝大多数dp问题,有兴趣可以移步我的另一篇博客:指路。
贪心最主要的特点是只关注下一步如何利益最大化而非全局。
这样的算法就是尝试把所有局部最优解结合起来,得到全局最优解。
贪心解决的问题
很明显这样的思想不一定是对的,而其难点在于,如何证明这样的解法是对的。
能使用贪心的题目有一定限制,或者可以通过将数据修改(排序等),符合贪心题目的限制。
这里有一个证明方法:如有一类数 c n t cnt cnt,和一个数 a n s ans ans,若:
c n t < = a n s cnt <= ans cnt<=ans 并且 c n t > = a n s cnt >= ans cnt>=ans 则 c n t = a n s cnt = ans cnt=ans
贪心也是一样,如果最终答案符合即可以小于等于所有方案,又可以大于等于所有可能的方案,自然就是最终答案了。
以下的几个题型,本文详细给出了题目及解题方法。
区间问题
通用思路
区间问题往往通用步骤就是先排序,按照左端点或者右端点。
再从小到大枚举每个区间。
选出当前如何选利益最大化(一般是通用的,比如选最右边或者最大等特征)。
遍历后续情况,按照该特征继续选取,得出最后结论。
那么我们先看一道题:
典例1:区间选点
分析
根据输入样例,按照通用步骤,我们假设按照右端点进行排序,由于每个区间必须包含一个点,所以该区间上一定是存在一个点的。
按照贪心的思想:如何选取这个点使整个选取利益最大化? 本题的利益