买卖股票的最佳时机 III |刷题打卡

816 阅读3分钟

题目

给定一个数组,它的第 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 春招闯关活动」, 点击查看 活动详情