122. Best Time to Buy and Sell Stock II [JavaScript]

本文深入解析股票买卖策略,特别是允许多次交易的情况。通过定义状态hold和sell,详细阐述了如何在每次状态变化中求解最大收益,包括边界状态和状态转移方程。

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

一、解题思路

  相比较121. Best Time to Buy and Sell Stock,本道题允许多次交易,本质上就是买进和卖出两种操作的多次切换。

  那么可以这样定义状态:

  hold[i]表示第i天所持有的最大价值
  sell[i]表示第i天出售所产生的最大价值

  这两种状态分别对应买进和卖出两种操作所产生的状态:

  • 买进时,所持有的最大价值(hold[i])需要减去当前股票的价值。
  • 卖出时,出售所产生的最大价值(sell[i])需要加上当前股票的价值。

  边界状态为:

  hold[0] = -price[0]
  sell[0] = 0

  由于求解的是最大值,所以在每一次状态变化的时候需要考虑当前是否需要买进或者卖出,即状态转移方程为:

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

二、代码实现

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], sell[i - 1] - price)
  }

  return sell[max - 1]
}

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值