一、贪心算法和回溯算法,动态规划的区别
「解决一个问题需要多个步骤,每一个步骤有多种选择」这样的描述我们在「回溯算法」「动态规划」算法中都会看到。它们的区别如下:
「回溯算法」需要记录每一个步骤、每一个选择,用于回答所有具体解的问题;
「动态规划」需要记录的是每一个步骤、所有选择的汇总值(最大、最小或者计数);
「贪心算法」由于适用的问题,每一个步骤只有一种选择,一般而言只需要记录与当前步骤相关的变量的值。
二、贪心算法满足的条件
- 最优子结构:规模较大的问题的解由规模较小的子问题的解组成,区别于「动态规划」,可以使用「贪心算法」的问题「规模较大的问题的解」只由其中一个「规模较小的子问题的解」决定;
- 无后效性:后面阶段的求解不会修改前面阶段已经计算好的结果;
- 贪心选择性质:从局部最优解可以得到全局最优解。
- 对「最优子结构」和「无后效性」的理解同「动态规划」,「贪心选择性质」是「贪心算法」最需要关注的内容。
「贪心算法」总是做出在当前看来最好的选择就可以完成任务;
解决「贪心算法」几乎没有套路,到底如何贪心,贪什么与我们要解决的问题密切相关。因此刚开始学习「贪心算法」的时候需要学习和模仿,然后才有直觉,猜测一个问题可能需要使用「贪心算法」,进而尝试证明,学会证明。
三、比较典型题目案例
3-1、【455.分发饼干题】(该题目已单独写文章) 可查看链接:455. 分发饼干
3-2、【一系列找零钱问题】
找零钱问题统一思路,一般都是先给出尽可能多的面值较大的纸币(硬币),然后再给出尽可能多的面值第二大的纸币(硬币),直到凑成了我们需要凑出的金额为止,这样找零钱得到的纸币(硬币)的张数(个数)最少。能够这样做,与 可选的硬币(纸币)的面值密切相关,大家可以仔细想一想这个问题,相信会是一个非常不错的思考问题。
【860.柠檬水找零】(该题目已单独写文章)可查看链接: 860. 柠檬水找零
3-3、【区域选择系列题目】
一类使用「贪心算法」解决的问题称为「活动选择问题」,解决这一类问题的直觉是「优先选择活动最早的活动」。
可以查看下面3道典型的题目(每道题目都单独写了详细解法)
56. 合并区间: 【贪心算法思路】区间重叠问题的处理,首先左边界排序,排序之后局部最优:每次合并都取【最大的右边界】,这样就可以合并更多的区间了,最后合并所有重叠的区间。
435. 无重叠区间 找到需要移除区间的最小数量,使剩余区间互不重叠