理论
其实贪心算法核心思想在于通过局部最优达到全局最优
这种算法更多是一种常识性的考量,所以在很多时候可能你用到了贪心算法但是并没有主观感受
问题在于如果通过确定某种情况下从局部最优推到全局最优的可行性,这部分最好的方式就是举反例或是手动模拟一下局部最优可以推到全局最优
将问题分为若干子问题 找到贪心策略 求解每一个子集最优解然后迭代得到全局最优解
贪心问题解法
本质上还是子问题的划分 确定好贪心策略(这个是贪心算法的核心 只有对应问题找到对应的贪心策略才能保证结构的正确)最后将子问题的贪心解堆叠即可得到全局最优解
Leetcode例题
122买卖股票最佳时机
像这个题就是非常经典的贪心算法问题
需要注意的点是 对于这道题目而言 利润的最小单位是两天 我们要获取最大利润就是要去抓取每一天能够获取的利润 我们把相邻两天的股价变化算出来 抓住股票会上升的所有间隙即可
763划分字母区间
这个题目思路是这样的 先遍历一遍字符串 得到每个字母的最远出现下标 然后从头开始遍历 不断更新当前区间的目标下标 达到后就定下一个区间 然后接着遍历
动态规划和贪心算法的区别
如果一个问题有很多重复的子问题,那么用动态规划是最有效的
动态规划中的每一个状态一定是由上一个状态推导出来的,是有DP递推方程的,而贪心算法是没有推导的,关键是在于针对不同的问题去制定正确有效的贪心策略,然后每一步都直接从局部选取最优后,把每一步决策结果收集就得到了问题的解
可以用一个很简单的例子来区分他们
比如现在有一个背包和很多件物品,物品有重量和价值两个属性,每件物品只能选一次,如果不考虑重量即这个书包是承重是无限大的,让你选有限个数的物品来得到价值最大的背包,那你肯定是贪心算法每次去选当前最有价值的物品,这样最后你就得到了价值最大的背包,可是如果现在这个背包的承重是有限的了,那你就要动态规划怎么装物品来使得背包价值最大了。