js 买卖股票的最佳时机 II

方法一:贪心策略(局部最优达到全局最优)
解题思路:
第i天买入,第j天卖出和第i天买入,第i+P天卖出所得的收益是一样的。例如:[1,2,3,4,5],最大收益是4,如果第一天买入,第二天卖出,同时再买入,第三天又卖出…和第一天买入,第五天卖出所得收益是一样的。这就是贪心策略,一局部最优达到全局最优
代码如下:

var maxProfit = function (prices) {
  if (prices === null || prices.length === 0 ) return 0 // 没有收益
  let point = 0 
  for (let i = 1; i < prices.length; i++) {
    if (prices[i] > prices[i - 1]) {
      point += prices[i] - prices[i - 1]
    }
  }
  return point
}

方法二:动态规划法
解题思路:
1、第i天有两种操作:
卖出:前一天买入后,如果今天卖出能获得利润,就卖出,否者保持不变
买入:前一天卖出后,今天可按照prices[i]的价格买入,但买入之后的利润减少,就不买了
2、交换状态(Math.max() 一组数字内取最大值)
卖出:sell = Math.max(sell, buy + prices[i]);
买入:buy = Math.max(buy, lastSell - prices[i]);

 var maxProfit = function (prices) {
  if (prices === null || prices.length === 0 ) return 0 // 没有收益
  let sell = 0 // 卖出的最大利润,第一次没有卖出,利润为0
  let buy = -prices[0] // 买入的最大利润,第一次买入,所以为负数
  for (let i = 1; i < prices.length; i++) {
    const lasterSell = sell // 每次保存卖出的利润
    sell = Math.max( // 取两者最大值为本次操作卖出的总利润
      sell, // 如果上一次为卖出,这次没有股票可卖
      buy + prices[i]  // 如果上一次为买入,卖出利润为上一次的卖出利润加当前数字
    )
    buy = Math.max(
      buy, // 如果上一次为买入,这次没有股票可买
      lasterSell - prices[i] // 如果上一次为卖出,买入的利润 = 卖出的利润 - 当前数字
    )
  }
  return Math.max(sell, buy)
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值