题目描述
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;
}
};