资深守护
- 贪心算法的基本思想
在对一个问题求解时,总是做出在当前看来是最好的选择。也就是说,把一个较复杂的问题分解成若干子问题,对于每个子问题来说, 不从整体最优上加以考虑,只做出在某种意义上的局部最优解。
通过每次得到局部最优解答,逐步推导出问题,进而得到全局最优解。
通俗地来讲,就是怎么做有利就怎么做。
- 贪心问题的解决总是伴随着排序,我们以选择尽量优的解的原则,将事物按照最优的解在最前的顺序排好,然后依次选取最优选择,构成整体最优解。
-
数字的拆分
将一个大数拆分成小数字的和,如果要求拆分的数量尽量少,则贪心的思路是尽量拆成大的数字,值不够了再往小的数字去拆。
数字删除固定位数
把一个数字删除固定位数,要求最后剩的数字最大,不能只是删除所有小的数字。比如:2131要求删2位,如果是删除两个1,会得到23,但其实删掉21,剩下31才是最大的。
因为删除后的数字位数是确定的,所以正确的贪心思路应该是让首位数字尽可能大。数字组合位数
把若干个数字组合成一个新的数字,使其最小。不能够只是把短的数字或者小的数字放前面,比如2和11组合,把11放前面组成的数字更小。
此时要考虑的是数字组合之后数值更小,比如a和b组合,我们应当比较ab和ba的大小,来确定谁放前面。 -
区间覆盖类问题
对于区间覆盖类的问题(区间可能有重叠,问被覆盖的区间总大小),解题时考虑按照每个区间的起点从前往后排序,然后遍历每个区间,判断当前区间是否与前一个区间相连(判断当前区间的起点在上个区间的终点之前还是之后)。
活动安排问题
限定的场地要安排多个活动,不同的活动间时间可能会冲突,怎么才能安排尽量多的活动?
按照活动的结束时间从小到大排序,尽量安排结束时间早的活动,这样才能为后续安排活动留下更充足的时间。
建立模型
对于某些贪心问题,直接想思路并不好想,需要对问题进行分析,建立数学模型,在此基**上确立贪心思路。
验证贪心思路
对于某个问题贪心思路的正确**验证,我们可以尝试按照此思路是否能举出反例,这是一个很好的筛选贪心思路的方法。