动态规划之股票问题

剑指 Offer 63. 股票的最大利润

题目描述

假设把某股票的价格按照时间先后顺序存储在数组中,请问买卖该股票一次可能获得的最大利润是多少?

示例 1:

输入: [7,1,5,3,6,4]
输出: 5
解释: 在第 2 天(股票价格 = 1)的时候买入,在第 5 天(股票价格 = 6)的时候卖出,最大利润 = 6-1 = 5 。
     注意利润不能是 7-1 = 6, 因为卖出价格需要大于买入价格。

示例 2:

输入: [7,6,4,3,1]
输出: 0
解释: 在这种情况下, 没有交易完成, 所以最大利润为 0。
  • 限制:0 <= 数组长度 <= 10^5

解法:动态规划

【动态规划】

  • dp[i][0] 表示第i天不持有股票所得现金。
  • dp[i][1] 表示第i天持有股票所得现金。

如果第i天不持有股票即dp[i][0], 也可以由两个状态推出来

  • 第i-1天就不持有股票,那么就保持现状,所得现金就是昨天不持有股票的所得现金 即:dp[i - 1][0]
  • 第i天卖出股票,所得现金就是按照今天股票佳价格卖出后所得现金即:dp[i - 1][1] + prices[i]
  • 所以 dp[i][0] = max(dp[i-1][0], dp[i-1][1] + prices[i])

如果第i天持有股票即dp[i][1], 那么可以由两个状态推出来

  • 第i-1天就持有股票,那么就保持现状,所得现金就是昨天持有股票的所得现金 即:dp[i - 1][1]
  • 第i天买入股票,所得现金就是买入今天的股票后所得现金即:-prices[i]
  • 所以dp[i][1] = max(dp[i - 1][1], -prices[i]);
var maxProfit = function(prices) {
  if(prices.length === 0)return 0
  const dp = Array.from(prices).map(()=> new Array(2).fill(0))
  dp[0][0] = 0, dp[0][1] = - prices[0]
  for(let i = 1; i < dp.length; i ++){
    dp[i][0] = Math.max(dp[i-1][0], dp[i-1][1] + prices[i])
    dp[i][1] = Math.max(dp[i-1][1], - prices[i])
  }
  // console.log(dp)
  return dp[dp.length - 1][0]
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值