LeetCode题解:121. 买卖股票的最佳时机,一次遍历,JavaScript,详细注释

271 阅读1分钟

原题链接:leetcode-cn.com/problems/be…

解题思路:

  1. 对于第i天的价格来说,当前已知以前所有价格中的最小值,并且第i天只能与其之前的最小价格交易。
  2. 如果第i天价格比最小值小,利润必然为负,则无需交易,只要将第i天价格设为最小值。
  3. 如果第i天价格比最小值大,则可以计算当前利润并与历史利润对比取最大值。
  4. 对于第一天,只需要将当前价格设为最小值,且无需交易,因此将最小值的初始状态设为Infinity,保证第一天价格能够被正常处理。
/**
 * @param {number[]} prices
 * @return {number}
 */
var maxProfit = function (prices) {
  let max = 0; // 存储最大利润
  // 存储股票的最低价格,为保证第一个元素能被正常获取,设置为Infinity
  let minPrice = Infinity;

  // 遍历所有股票价格
  for (const price of prices) {
    if (price < minPrice) {
      // 当当前价格小于已存储的最小价格时,此时利润为负,无需进行交易
      // 同时之后的交易肯定会根据当前价格进行,因此把当前价格设置为最小值
      minPrice = price;
    } else {
      // 当前价格大于等于最小值,则可以进行交易
      // 同时去当前利润与历史最大利润较大者,设置为新的最大值
      max = Math.max(price - minPrice, max);
    }
  }

  return max;
};