题目描述:

给定一个数组 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].显然两者直接求最大值才能利润最大化,即:

当天未持有股票也有两种状态:当天卖出股票 / 当天前一天也未持有股票。当天前一天也未持有股票,则维持前一天的状态 即 dp[i][1] = dp[i-1][1]。当天卖出股票说明前一天持有股票,那么现金 = 前一天持有股票的现金 + 当天股票的售价,即 dp[i][1] = dp[i-1][0] + prices[i]。同样两者求最大值:

初始化:dp[0][0] 即第一天持有股票,只能当天买入,即 dp[0][0] = prices[0]

dp[0][1] 即第一天未持有股票,没有前一天,所以 dp[0][1] = 0。

完整代码:

/*** @param {number[]} prices* @return {number}*/
var maxProfit = function(prices) {const len=prices.length;const dp=new Array(len).fill([0,0]);dp[0][0]=-prices[0];dp[0][1]=0;for(var i=1;i<len;i++){dp[i]=[Math.max(dp[i-1][0],dp[i-1][1]-prices[i]),Math.max(dp[i-1][1],dp[i-1][0]+prices[i])]}return dp[len-1][1];
};

欢迎指正!

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

  1. Leetcode 122.买卖股票的最佳时机 II (每日一题 20210618)

    给定一个数组 prices ,其中 prices[i] 是一支给定股票第 i 天的价格.设计一个算法来计算你所能获取的最大利润.你可以尽可能地完成更多的交易(多次买卖一支股票).注意:你不能同时参与多 ...

  2. Leetcode 122.买卖股票的最佳时机II

    Time: 20190904 Type: Easy 考察:动态规划 题目描述 给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格. 设计一个算法来计算你所能获取的最大利润.你可以尽可能地完 ...

  3. leetcode 122. 买卖股票的最佳时机 II 思考分析

    目录 题目 贪心法 题目 给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格. 设计一个算法来计算你所能获取的最大利润.你可以尽可能地完成更多的交易(多次买卖一支股票). 注意:你不能同时 ...

  4. leetcode 122. 买卖股票的最佳时机 II(贪心算法)

    给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格. 设计一个算法来计算你所能获取的最大利润.你可以尽可能地完成更多的交易(多次买卖一支股票). 注意:你不能同时参与多笔交易(你必须在再次 ...

  5. LeetCode 122 买卖股票的最佳时机 II

    题目描述 给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格.设计一个算法来计算你所能获取的最大利润.你可以尽可能地完成更多的交易(多次买卖一 支股票).注意:你不能同时参与多笔交易(你必 ...

  6. leetcode 122. 买卖股票的最佳时机 II

    难度:中等 频次:35 题目: 给定一个数组 prices ,其中 prices[i] 表示股票第 i 天的价格. 在每一天,你可能会决定购买和/或出售股票.你在任何时候 最多 只能持有 一股 股票. ...

  7. 106. Leetcode 122. 买卖股票的最佳时机 II (动态规划-股票交易)

    步骤一.确定状态: 确定dp数组及下标含义 dp[i]是一个长度为len(prices)的一维数组,表示的是在第i天持有股票 步骤二.推断状态方程: 第i天持有股票,即dp[i][1], 那么两个状态 ...

  8. leetcode 122 买卖股票的最佳时机II

    贪心算法:如果今天买明天能够盈利,那就今天买入明天卖出:对于这个问题来讲是具有最优子结构性质的 分情况: 1)当len<1:不会赚钱,return 0: 2) class Solution { ...

  9. Leetcode 122. 买卖股票的最佳时机 II 解题思路及C++实现

    解题思路: 采用贪心策略,只要后一天的价格高于前一天,就将差价加进来.得到的结果就是能获取的最大利润. class Solution { public:int maxProfit(vector< ...

  10. 159. Leetcode 122. 买卖股票的最佳时机 II (贪心算法-股票题目)

    class Solution:def maxProfit(self, prices: List[int]) -> int:result = 0for i in range(1,len(price ...

最新文章

  1. centos7 没有pip命令_Linux(CentOS7)部署系列---Docker编排应用部署方案
  2. python前端开发之准备开发环境(建议收藏)
  3. 无法显示论坛的登陆验证码
  4. 51nod 1073约瑟夫环
  5. Linux(14)-正则表达式
  6. mysql8.0.13 rpm_Centos7 安装mysql 8.0.13(rpm)的教程详解
  7. dataframe 一列的不同值_python数据分析包|Pandas-02之缺失值(NA)处理
  8. 从门户网站看内容传播的开放式革命
  9. SAP License:SAP不便解决的问题之五——客供料
  10. jdk15不安装jre_弄懂 JRE、JDK、JVM 之间的区别与联系,你知道多少?
  11. curses.h: No such file or directory
  12. 数据集下载地址(转)以下内容转自https://baijiahao.baidu.com/s?id=1615853849218131902wfr=spiderfor=pc
  13. 2018年泰迪杯心得总结--最全的数学建模、数据挖掘的比赛入门
  14. Android——ViewHolder
  15. 吃鸡显示服务器资源不足,Win10系统玩绝地求生提示虚拟内存不足的解决方法教程[多图]...
  16. 修改Hosts文件解决文件访问问题
  17. 深大uooc学术道德与学术规范教育第十章
  18. 游戏和股票的结构有一定的类似性
  19. js和jquery获取父级元素、子级元素、兄弟元素的方法
  20. C语言学习——保留小数点后n位并四舍五入

热门文章

  1. Delphi 仿QQ皮肤控件设计与运行效果图
  2. high sierra php,mac os high sierra下搭建php多版本-php5.2+php5.6-nginx
  3. Go-加密学(四) - 证书/SSL/TLS/https单向认证/思维导图
  4. matlab fill 图案填充,Matlab条形图中填充图案
  5. 【测评】国外AR平台ENTITI测评-网页编辑器(1)
  6. 开关电源输出纹波主要来源五个方面?示波器测纹波方法?
  7. 开源的PHP DKP系统
  8. consul剔除无效服务
  9. Pytorch 节省内存、显存的一些技巧
  10. 复合调味品崛起,海天还会是YYDS吗?