121. Best Time to Buy and Sell Stock [JavaScript]

本文解析了通过一次买卖操作获得股票最大利润的算法。采用动态规划定义最小买入价和最大卖出价,通过状态转移方程计算各时间点最大差值,得出最大收益。深入分析了买入和卖出操作,定义sell和hold状态,给出简洁代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、解题思路

  本题要求求出交易一次所获取的最大收益,一次交易定义为:先购买再卖出。

  采用动态规划的方式处理该问题,需要定义两个状态:

  min[i]表示第i天股票的最小价值
  max[i]表示第i天之后股票的最大价值

  状态转移方程为:


            Math.min(min[i - 1], prices[i]) i > 0
  min[i] = 
            prices[i]                       i === 0

            Math.max(max[j + 1], prices[j]) j < len - 1
  max[j] = 
            prices[j]                       j === len - 1

  接下来只要计算在各个时间点购买所产生的最大差值,即为最大收益。

const maxProfit = prices => {
  const len = prices.length
  if (len < 2) {
    return 0
  }

  const min = [prices[0]]

  const max = []
  max[len - 1] = prices[len - 1]

  for (let i = 1; i < len; i++) {
    min[i] = Math.min(min[i - 1], prices[i])
    max[len - i - 1] = Math.max(max[len - i], prices[len - 1 - i])
  }
  // 找出最大差值
  let ans = 0
  for (let i = 0; i < len; i++) {
    ans = Math.max(ans, max[i] - min[i])
  }
  return ans
}

  以上是比较常规的思路,再深入理解这道题目,实际上就是执行两种操作:买入和卖出。

  • 执行买入操作时,会使减少当前收益,需要保证任意时间点该值的最大值。
  • 执行卖出操作时,所得收益为 当前收益+股票的价值,需要保证任意时间点该值为最大值。

  那么可以定义两个状态:

  sell[i]表示第i天的最大收益
  hold[i]表示第i天持有的最大价值

  边界条件为:

  sell[0] = 0
  hold[0] = [-prices[0]]

  那么状态转移方程为:

  sell[i] = Math.max(sell[i - 1], hold[i - 1] + price)
  hold[i] = Math.max(hold[i - 1], -price)

二、代码实现

const maxProfit = prices => {
  const max = prices.length
  if (max < 2) {
    return 0
  }

  const sell = [0]
  const hold = [-prices[0]]

  for (let i = 1; i < max; i++) {
    const price = prices[i]
    sell[i] = Math.max(sell[i - 1], hold[i - 1] + price)
    hold[i] = Math.max(hold[i - 1], -price)
  }
  return sell[max - 1]
}

  如果本文对您有帮助,欢迎关注微信公众号,为您推送更多大前端相关的内容, 欢迎留言讨论,ε=ε=ε=┏(゜ロ゜;)┛。

  您还可以在这些地方找到我:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值