题目
给定一个数组,它的第 i 个元素是一支给定的股票在第 i 天的价格。
设计一个算法来计算你所能获取的最大利润。你最多可以完成两笔交易。
注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。
示例:
输入:prices = [3,3,5,0,0,3,1,4]
输出:6
解释:在第 4 天(股票价格 = 0)的时候买入,在第 6 天(股票价格 = 3)的时候卖出,
这笔交易所能获得利润 = 3-0 = 3 。
随后,在第 7 天(股票价格 = 1)的时候买入,在第 8 天 (股票价格 = 4)的时候卖出,
这笔交易所能获得利润 = 4-1 = 3 。
示例2:
输入:prices = [1,2,3,4,5]
输出:4
解释:在第 1 天(股票价格 = 1)的时候买入,在第 5 天 (股票价格 = 5)的时候卖出,
这笔交易所能获得利润 = 5-1 = 4 。
注意你不能在第 1 天和第 2 天接连购买股票,之后再将它们卖出。
因为这样属于同时参与了多笔交易,你必须在再次购买前出售掉之前的股票。
示例3:
输入:prices = [7,6,4,3,1]
输出:0
解释:在这个情况下, 没有交易完成, 所以最大利润为 0。
示例4:
输入:prices = [1]
输出:0
解体思路
在计算收益中,我们首要维护4个参数,即,第一次买,第一次卖。第二次买,第二次卖。这里我们假如买卖需要2次的话,要在第二次买入的时候减去我们第一次的收益,这样我们就可以不用考虑第一次买卖的收益去维护,在第二次买的时候我们就已经更低的价格购入,计算入成本价格。
复杂的概念我们这里就不用繁琐的文字说明,来用代码说明,看我的注释哟,跟随我的思路走
/**
* @param {number[]} prices
* @return {number}
*/
var maxProfit = function(prices) {
/**
对于任意一天需要考虑四个变量
fstBuy:第一次买入的价格
fstSell:第一次卖出可以获得最大收益
secBuy:第二次买入的价格
secSell:第二次卖出可以获得最大收益
分别对这四个变量进行相应更新,最后secSell就是最大的收益值 (secSell > fstSell)
*/
let fstBuy = Math.pow(2,53); // 声明一个最大值,保证在找最小值的时候不会出错
let fstSell = 0; // 初始收益为0
let secBuy = Math.pow(2,53); // 同第一次买入价格解释
let secSell = 0; // 同初始收益
for(const p of prices){
// 找到我们最小购入的价格
fstBuy = Math.min(fstBuy, p);
// 卖出,收益就有了,就用卖出的价格减去买入的价格, 对比,今天卖挣钱,还是昨天卖挣钱,如果今天挣得钱比昨天多,那就继续持有,不然就卖掉
fstSell = Math.max(fstSell, p - fstBuy);
// 第二次买,你的买入价是要考虑你第一次的收益的,所以你要减去你的收益就是的成本
secBuy = Math.min(secBuy, p - fstSell);
// 第二次卖出,同样,对比卖出还是继续持有,找到卖出的最大值,卖出,得到最大收益。
secSell = Math.max(secSell, p - secBuy);
}
return secSell;
};
”本文正在参与「掘金 2021 春招闯关活动」, 点击查看 活动详情