LeetCode188:Best Time to Buy and Sell Stock IV

Say you have an array for which the ith element is the price of a given stock on day i.

Design an algorithm to find the maximum profit. You may complete at most k transactions.

Note:
You may not engage in multiple transactions at the same time (ie, you must sell the stock before you buy again).

Credits:

Special thanks to @Freezen for adding this problem and creating all test cases.


K次交易的问题。

直接考虑这个问题会有点复杂,但是可以借助于前一篇Best Time to Buy and Sell Stock III的第二种解法的思想。

记selln[i]表示第i比交易卖出时的最大收入,buyn[i]表示第i比交易买入时的最大收入。假设最开始有0元

共有k比交易,那么有:

selln[k]=max(selln[k],buyn[k]+prices[j])

buyn[k]=max(buyn[k],selln[k-1]+prices[j])

selln[k-1]=max(selln[k-1],buyn[k-1]+prices[j])

buyn[k-1]=max(buyn[k-1],selln[k-2]+prices[j])

......

selln[i]=max(selln[i],buyn[i]+prices[j])

buyn[i]=max(buyn[i],selln[i-1]+prices[j])

上面的式子使用一个循环就可以表示了。

需要注意的一点是如果k大于了prices.size(),那么这就是最简单的情况,不需要使用上面的分析方法。时间复杂度是O(kn),空间复杂度是O(n)。

runtime:8ms

class Solution {
public:

    int maxProfit(int k, vector<int>& prices) {
        int length=prices.size();
        if(length==0||length==1)
            return 0;
        if(k>length)
        {
            int ans=0;
            for(int i=1;i<length;i++)
                ans+=max(prices[i]-prices[i-1],0);
                
            return ans;
        }
        
        int *buyn=new  int[k+1]();
        int *selln=new  int[k+1]();
        for(int i=0;i<=k;i++)
        {
            buyn[i]=numeric_limits<int>::min();
            selln[i]=0;
        }
        for(int i=0;i<prices.size();i++)
        {
           		for(int j=k;j>0;j--)
		        {
		        	selln[j]=max(selln[j],buyn[j]+prices[i]);
		        	buyn[j]=max(buyn[j],selln[j-1]-prices[i]);
	        	}
        }
        return selln[k];
    }
};





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值