开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第27天,点击查看活动详情
贪心算法
贪婪算法的 Wikipedia 定义:是一种在每一步选中都采取在当前状态下最好或最优的选择,从而希望导致结果是最好或最优的算法。
- 优点:对于一些问题,非常直观有效。
- 缺点:并不是所有问题都能用它去解决;得到的结果并一定不是正确的,因为这种算法容易过早地做出决定,从而没有办法达到最优解。
题目描述
给定一个数组 prices ,其中 prices[i] 表示股票第 i 天的价格。
在每一天,你可能会决定购买和/或出售股票。你在任何时候 最多 只能持有 一股 股票。你也可以购买它,然后在 同一天 出售。计算出你能获得的 最大 利润 。
思路分析
其实遇到题,单对题目的理解有时候可能就会理解错误。那么先来分析一下:
- 需要计算能获取到最大利润,那么就是尽量是在最低的时候买入,最高的时候卖出。题目没有限制可以买入卖出多少次,可以买入又卖出多次赚到利润即这过程的和
- 最多时候只能持有一股股票,那么意味着你买入后只能卖出,才能再买入第二次
- 如果数组prices[],是个降序的,那最好选择不买,最大利润就是0,不然都会是亏的。如
prices = [9,7,6,5,3,2,1].
使用贪心算法解析下: 只需要求出数组中每个数之前差值,前一个数减去后一个数的到差值大于0即是获得利润,小于0就是亏本,然后只需要将大于0的值相加就是最大的利润。
- 没要求一天内可买卖多少钱,也允许今天卖出,再买入这样的操作,所以数组内两两相减。这也是贪心算法中将整个过程都拆分到2个值之间形成一个新数组。
- 差值小于则完全无需操作,因为肯定是亏本,所以如果前一个数小于后一个数那就不操作。
代码实现
/**
* @param {number[]} prices
* @return {number}
*/
var maxProfit = function(prices) {
if(prices.length === 0) return 0;
var max = 0;
for(var i=0;i<prices.length;i++){
if(prices[i]<prices[i+1]){
max = max+ prices[i+1]-prices[i];
}
}
return max;
};
总结
贪心算法,找最优解时常用的方法,一般将求解过程分成若干个步骤,但每个步骤都应用贪心原则,选取当前状态下最好/最优的选择(局部最有利的选择),并以此希望最后堆叠出的结果也是最好/最优的解。