【初级算法|数组】02-买卖股票的最佳时机 II

79 阅读2分钟

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;
};

总结

贪心算法,就是将每个步骤都划分后干个步骤,每个步骤都是最优的,最好的,从而导致最后结果也是最优最好的。

来源