题目描述
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 mosttwo transactions.
Note:
You may not engage in multiple transactions at the same time (ie, you must sell the stock before you buy again).
----------------------------------------------------------------------------------------------------------------
思路:循环利用解决best-time-to-buy-and-sell-stock-i(一次交易的最大收益)的方法,将数组分为front和back两部分并分别求其中的一个最大收益作和。
每次更新保留较大收益。
代码实现:
class
Solution {
public
:
int
maxProfit(vector<
int
> &prices) {
if
(prices.size() <
2
)
return
0
;
const
int
n = prices.size();
vector<
int
> f(n,
0
);
vector<
int
> g(n,
0
);
for
(
int
i =
1
, valley = prices[
0
]; i < n; ++i) {
valley = min(valley, prices[i]);
f[i] = max(f[i -
1
], prices[i] - valley);
}
for
(
int
i = n -
2
, peak = prices[n -
1
]; i >=
0
; --i) {
peak = max(peak, prices[i]);
g[i] = max(g[i], peak - prices[i]);
}
int
max_profit =
0
;
for
(
int
i =
0
; i < n; ++i)
max_profit = max(max_profit, g[i] + f[i]);
return
max_profit;
}
};
------------------------------------------------------------
class
Solution {
public
:
int
maxProfit(vector<
int
> &prices) {
//You may complete at most two transactions.(you must sell the stock before you buy again)
//方式一:爆搜 (630ms 8552k)
/*
int len=prices.size();
int maxPro=0;
for(int i=0;i<len;i++){ //以i作为两次交易的分界线
int max1=0,max2=0;
for(int j=0;j<=i;j++){
for(int k=j+1;k<=i;k++){
int val = prices[k]-prices[j];
if(val>max1){
max1=val;
}
}
}
for(int j=i;j<len;j++){
for(int k=j+1;k<len;k++){
int val = prices[k]-prices[j];
if(val>max2){
max2=val;
}
}
}
if(max1+max2>maxPro)maxPro = max1+max2;
}
return maxPro;
*/
//方式二:波峰波谷检测法,可以减小不必要的搜索空间,相比于第一种效率提升了不少 (180ms 8568k)
int
len = prices.size();
if
(len<=1)
return
0;
vector<
int
> flag(len,0);
for
(
int
i=1;i<len-1;i++){
if
(prices[i]>prices[i-1]&&prices[i]>=prices[i+1])flag[i]=1;
//标记为波峰(比较时注意相等情况)
if
(prices[i]<prices[i-1]&&prices[i]<=prices[i+1])flag[i]=-1;
//标记为波谷
}
if
(prices[0]<=prices[1])flag[0]=-1;
if
(prices[len-1]>prices[len-2])flag[len-1]=1;
//搜索
int
maxPro=0;
for
(
int
k=0;k<len;k++){
int
max1=0,max2=0;
for
(
int
i=0;i<=k;i++){
if
(flag[i]==-1){
for
(
int
j=i+1;j<=k;j++){
if
(flag[j]==1){
int
val = prices[j]-prices[i];
if
(val>max1)max1 = val;
}
}
}
}
for
(
int
i=k;i<len;i++){
if
(flag[i]==-1){
for
(
int
j=i+1;j<len;j++){
if
(flag[j]==1){
int
val = prices[j]-prices[i];
if
(val>max2)max2 = val;
}
}
}
}
int
val = max1+max2;
if
(val>maxPro)maxPro = val;
}
return
maxPro;
}
};