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比交易买入时的最大收入。
共有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]; } };