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];
    }
};





你可能感兴趣的:(LeetCode188:Best Time to Buy and Sell Stock IV)