一、贪心算法
上一节讲了动态规划,这里再讲一个和动态规划相似的算法,有时候也很容易搞混,即贪心算法。
贪心算法和动态规划算法,都是用来求解最优化问题。但是在很多问题上,使用动态规划会有大炮打蚊子的感觉,而且使用贪心算法可以使问题更简单化。
贪心算法,会做出局部最优的解,然后利用局部的解,得到全局的最优解。贪心算法的两个关键要素:
- 贪心选择性质
- 最优子结构
下面将介绍下这两个关键要素
二、贪心选择性质
贪心选择性质,是贪心算法区别于动态规划的一个重要要素之一。贪心算法通常采用自顶向下,每做一次贪心选择,就将原定问题变为规模更小的问题,也就是说每次选择都会做出当时看来是最优的解,然后再继续向下求解。这样,最终整体得到一个最优解。
因为最优子结构在动态规划中已经解释过了,这里不再详解。而关于贪心选择性质,就直接通过算法实例来体会吧。
三、贪心算法
买卖股票的最佳时机Ⅱ 给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格。
设计一个算法来计算你所能获取的最大利润。你可以尽可能地完成更多的交易(多次买卖一支股票)。
注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。
示例 1:
输入: [7,1,5,3,6,4] 输出: 7 解释: 在第 2 天(股票价格 = 1)的时候买入,在第 3 天(股票价格 =
5)的时候卖出, 这笔交易所能获得利润 = 5-1 = 4 。
随后,在第 4 天(股票价格 = 3)的时候买入,在第 5 天(股票价格 = 6)的时候卖出, 这笔交易所能获得利润 = 6-3 = 3 。 示例 2:输入: [1,2,3,4,5] 输出: 4 解释: 在第 1 天(股票价格 = 1)的时候买入,在第 5 天 (股票价格 =
5)的时候卖出, 这笔交易所能获得利润 = 5