LeetCode刷题(八)——贪心算法

定义

贪心算法(又称贪婪算法)是指,在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,算法得到的是在某种意义上的局部最优解 。
贪心算法不是对所有问题都能得到整体最优解,关键是贪心策略的选择。也就是说,不从整体最优上加以考虑,做出的只是在某种意义上的局部最优解。

算法思想

  • 将求解问题分成若干子问题
  • 对每个子问题求解得到子问题的局部最优解
  • 将所有局部最优解合并成原问题的一个解

贪心算法是一种对某些求最优解问题的更简单、更迅速的设计技术。贪心算法采用自顶向下,以迭代的方法做出相继的贪心选择,每做一次贪心选择,就将所求问题简化为一个规模更小的子问题,通过每一步贪心选择,可得到问题的一个最优解。虽然每一步上都要保证能获得局部最优解,但由此产生的全局解有时不一定是最优的,所以贪心算法不要回溯

使用条件

利用贪心法求解的问题应具备如下2个特征:

1、贪心选择性质

一个问题的整体最优解可通过一系列局部的最优解的选择达到,并且每次的选择可以依赖以前作出的选择,但不依赖于后面要作出的选择。这就是贪心选择性质。对于一个具体问题,要确定它是否具有贪心选择性质,必须证明每一步所作的贪心选择最终导致问题的整体最优解。

2、最优子结构性质

当一个问题的最优解包含其子问题的最优解时,称此问题具有最优子结构性质。问题的最优子结构性质是该问题可用贪心法求解的关键所在。在实际应用中,至于什么问题具有什么样的贪心选择性质是不确定的,需要具体问题具体分析。

leetCode例题

跳跃游戏
分发糖果
加油站
贪心算法很适合那些只需要判断是否有符合条件的解的题目。比如上面例题,我们只需要找到一个解能满足要求即可。以跳跃游戏为例,记录向右能到达的最远距离,最后看其能否到达终点。贪心算法类似动态规划。

局限性

  • 不能保证合并后的局部最优解就是全局最优解。
  • 只能确定某些问题是否具有可行性。

你可能感兴趣的:(LeetCode,贪心算法,动态规划)