Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情。
题目描述
给定一个数组 prices ,其中 prices[i] 表示股票第 i 天的价格。
在每一天,你可能会决定购买和/或出售股票。你在任何时候 最多 只能持有 一股 股票。你也可以购买它,然后在 同一天 出售。计算出你能获得的 最大 利润 。
思路分析
其实遇到题,单对题目的理解有时候可能就会理解错误。那么先来分析一下:
- 需要计算能获取到最大利润,那么就是尽量是在最低的时候买入,最高的时候卖出。题目没有限制可以买入卖出多少次,可以买入又卖出多次赚到利润即这过程的和
- 最多时候只能持有一股股票,那么意味着你买入后只能卖出,才能再买入第二次
- 如果数组prices[],是个降序的,那最好选择不买,最大利润就是0,不然都会是亏的。如
prices = [9,7,6,5,3,2,1]
.
使用贪心算法解析下:
贪心算法:寻找最优解时常用的方法,一般将求解过程分成若干个步骤,但每个步骤都应用贪心原则,选取当前状态下最好/最优的选择(局部最有利的选择),并以此希望最后堆叠出的结果也是最好/最优的解。
所以,只需要求出数组中每个数之前差值,前一个数减去后一个数的到差值大于0即是获得利润,小于0就是亏本,然后只需要将大于0的值相加就是最大的利润。
- 没要求一天内可买卖多少钱,也允许今天卖出,再买入这样的操作,所以数组内两两相减。这也是贪心算法中将整个过程都拆分到2个值之间形成一个新数组。
- 差值小于则完全无需操作,因为肯定是亏本,所以如果前一个数小于后一个数那就不操作。
AC 代码
/**
* @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;
};
总结
贪心算法,就是将每个步骤都划分后干个步骤,每个步骤都是最优的,最好的,从而导致最后结果也是最优最好的。
来源