Best Time to Buy and Sell Stock IV
- 问题描述:leetcode:188
- 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).
思路:
按照思路写的代码:
int maxProfit(int k, vector<int>& prices) {
if(k==0||prices.size()<2){
return 0;
}
}
int maxdiff = 0;
vector<vector<int> > T(k+1, vector<int> (prices.size(), 0));
for(int i=1; i<k+1; i++){
maxdiff = T[i-1][0] - prices[0] ;
for(int j=1; j<prices.size(); j++){
T[i][j] = max(T[i][j-1], maxdiff+prices[j]);
maxdiff = max(maxdiff, T[i-1][j] - prices[j]);
}
}
return T[k][prices.size()-1];
}
但是该代码运行时会报错:
也就是说当k=1000000000时会导致内存出错;所以可以优化代码,也就是当
k>prices.size()
时使用不限定交易次数时的算法(Best Time to Buy and Sell Stock II;leetcode122)
修改之后代码:
int maxProfit(int k, vector<int>& prices) {
if(k==0||prices.size()<2){
return 0;
}
if(k>prices.size()){
int ans = 0;
for(int i=1; i<prices.size(); i++){
if(prices[i]>prices[i-1]){
ans += (prices[i]-prices[i-1]);
}
}
return ans;
}
int maxdiff = 0;
vector<vector<int> > T(k+1, vector<int> (prices.size(), 0));
for(int i=1; i<k+1; i++){
maxdiff = T[i-1][0] - prices[0] ;
for(int j=1; j<prices.size(); j++){
T[i][j] = max(T[i][j-1], maxdiff+prices[j]);
maxdiff = max(maxdiff, T[i-1][j] - prices[j]);
}
}
return T[k][prices.size()-1];
}