原题:
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 two transactions.
Note:
You may not engage in multiple transactions at the same time (ie, you must sell the stock before you buy again).
解题:
这个题被评为hard的级别,确实不是很好AC, 最开始是O(N2)的时间复杂度,直接TLE了。想了想还是用DP去做,这个时间复杂度O(N)和空间复杂度O(N)。主要是前后相邻元素相减,然后DP求连续最大子串和。但是需要把串分成两个部分,因为可能会购买抛售两次。直接上AC的C++代码:
int maxProfit(vector<int>& prices) {
int size = prices.size();
if(size <= 1)
return 0;
else if(size == 2)
return (prices[1]-prices[0]) > 0 ? (prices[1]-prices[0]):0;
vector<int> minus(size-1, 0);
for(int i=1; i<size; i++){
minus[i-1] = prices[i] - prices[i-1];
}
int max = 0, temp= 0;
int *max1 = new int[minus.size()];
for(int j=0; j<minus.size()-1; j++){
if((temp + minus[j]) >=0){
temp += minus[j];
if(temp > max){
max = temp;
}
}else{
temp = 0;
}
max1[j] = max;
}
temp = max = 0;
int *max2 = new int[minus.size()];
for(int j=minus.size()-1; j>=0; j--){
if((temp + minus[j]) >=0){
temp += minus[j];
if(temp > max){
max = temp;
}
}else{
temp = 0;
}
max2[j] = max;
}
max = 0;
for(int j=0; j<minus.size()-2; j++){
max = max > (max1[j] + max2[j+1]) ? max : (max1[j] + max2[j+1]);
}
max = max > max2[0] ? max : max2[0];
return max;
}