image.png

动态规划

dp数组的含义这些跟121都一样,不同的是递推公式。
因为可以多次买卖

  1. 所以当天持有股票的利润可以是
    1. ==前一天持有的利润,不操作
    2. 前一天不持有的利润-当天买入的价格
  2. 当天不持有股票的利润

    1. ==前一天不持有的利润,不操作
    2. 前一天持有的利润+当天卖出的价格 ```javascript var maxProfit = function(prices) { let dp =new Array(prices).fill([0,0]) dp[0][0] =-prices[0] //持有股票的收益 dp[0][1] =0 //不持有股票的收益

    for(let i=1;i<prices.length;i++){

    1. 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[prices.length-1][1]

};

  1. - 时间复杂度:O(n)
  2. - 空间复杂度:O(n)
  3. <a name="QV3n8"></a>
  4. ## 滚动数组
  5. ```javascript
  6. // 方法二:动态规划(滚动数组)
  7. const maxProfit = (prices) => {
  8. // 滚动数组
  9. // have: 第i天持有股票最大收益; notHave: 第i天不持有股票最大收益
  10. let n = prices.length,
  11. have = -prices[0],
  12. notHave = 0;
  13. for (let i = 1; i < n; i++) {
  14. have = Math.max(have, notHave - prices[i]);
  15. notHave = Math.max(notHave, have + prices[i]);
  16. }
  17. // 最终手里不持有股票才能保证收益最大化
  18. return notHave;
  19. }