JavaScript 每日一题---LeetCode 122. 买卖股票的最佳时机 II

题目描述:

给定一个数组 prices ,其中 prices[i] 表示股票第 i 天的价格。

在每一天,你可能会决定购买和/或出售股票。你在任何时候 最多 只能持有 一股 股票。你也可以购买它,然后在 同一天 出售。
返回 你能获得的 最大 利润 。

解题思路:

        该题与 LeetCode 121. 买卖股票的最佳时机 唯一区别就是可以多次买卖,一次买卖的 dp 本质上还是贪心法,找到 当前最低的购入价 与 与当前最低购入价相差最大的售出价(即局部最优解)。这也满足 dp 的基本策略:一个最优决策序列的任何子序列本身一定是相对于子序列的初始和结束状态的最优决策序列,即局部最优解也是该问题的子问题的解,即数组不变的情况下减少天数,局部解仍正确。

        而这题的关键在于 现金流 ,又可以分为两种情况 当天持有股票时的现金 与 当天不持有股票时的现金。假定初始现金为 0. dp 数组可以设为 dp[i][0] 表示第 i 天持有股票的现金,dp[i][1] 表示第 i 天不持有股票的现金。

        当天持有股票则可以分为两种状态:当天购入股票 / 当天前一天已持有股票。当天前一天已持有股票,则维持前一天的状态 即 dp[i][0] = dp[i-1][0]。当天购入股票说明前一天未持有股票,当天持有股票的现金 = 前一天未持有股票的现金 - 当天股票售价,即 dp[i][0] = dp[i-1][1] - prices[i].显然两者直接求最大值才能利润最大化,即:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值