当前位置:   article > 正文

LeetCode:买卖股票的最佳时机 IV_买卖股票的最佳时机iv leetcode

买卖股票的最佳时机iv leetcode

题目链接:https://leetcode-cn.com/problems/best-time-to-buy-and-sell-stock-iv/description/

买卖股票的最佳时机 III题解         https://blog.csdn.net/smile__dream/article/details/81700476

 

给定一个数组,它的第 i 个元素是一支给定的股票在第 天的价格。

设计一个算法来计算你所能获取的最大利润。你最多可以完成 k 笔交易。

注意: 你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。

示例 1:

  1. 输入: [2,4,1], k = 2
  2. 输出: 2
  3. 解释: 在第 1 天 (股票价格 = 2) 的时候买入,在第 2 天 (股票价格 = 4) 的时候卖出,这笔交易所能获得利润 = 4-2 = 2

示例 2:

  1. 输入: [3,2,6,5,0,3], k = 2
  2. 输出: 7
  3. 解释: 在第 2 天 (股票价格 = 2) 的时候买入,在第 3 天 (股票价格 = 6) 的时候卖出, 这笔交易所能获得利润 = 6-2 = 4
  4.   随后,在第 5 天 (股票价格 = 0) 的时候买入,在第 6 天 (股票价格 = 3) 的时候卖出, 这笔交易所能获得利润 = 3-0 = 3

思路:无非四种状态 当天买入不买或者卖出不卖 ,我们得到状态转移方程 

        buy[i]=max(buy[i],sell[i-1]-prices)    //buy[i]代表第i笔买入自己还剩的钱 买入则减去当天的价格

        sell[i]=max(sell[i],buy[i]+prices[i])   //selle[i]代表第i笔卖出后自己还剩的钱 卖出即加入当天的价格

 

  1. class Solution {
  2. public int quick(int[] prices){
  3. int max=0;
  4. for(int i=0;i<prices.length-1;i++){
  5. if(prices[i+1]>prices[i])
  6. max+=(prices[i+1]-prices[i]);
  7. }
  8. return max;
  9. }
  10. public int maxProfit(int k, int[] prices) {
  11. int len=prices.length;
  12. if(len==1||len==0||prices==null||k==0){
  13. return 0;
  14. }
  15. if(k>=len/2){
  16. return quick(prices);
  17. }
  18. int []buy=new int[k+1];
  19. int []sell=new int[k+1];
  20. for(int i=0;i<=k;i++){
  21. buy[i]=Integer.MIN_VALUE;
  22. }
  23. for(int i=0;i<len;i++){
  24. for (int j = 0; j<k; j++) {
  25. buy[j+1] = Math.max(buy[j+1], sell[j] - prices[i]);
  26. sell[j+1] = Math.max(buy[j+1] + prices[i], sell[j+1]);
  27. }
  28. }
  29. return sell[k];
  30. }
  31. }

 

Discuss:https://leetcode.com/problems/best-time-to-buy-and-sell-stock-iv/discuss/54113/A-Concise-DP-Solution-in-Java?page=2

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/知新_RL/article/detail/499922
推荐阅读
相关标签
  

闽ICP备14008679号