转载:来自梁佳宾的网络日志
求数组中差值最大的两个数,后面的那个数要大于前面的那个数
#include<vector>
#include<iostream>
#include<algorithm>
using namespace std;
//I题意:用一个数组表示股票每天的价格,数组的第i个数表示股票在第i天的价格。 如果只允许进行一次交易,也就是说只允许买一支股票并卖掉,求最大的收益。
//分析:动态规划法。从前向后遍历数组,记录当前出现过的最低价格,作为买入价格,并计算以当天价格出售的收益,作为可能的最大收益,整个遍历过程中,出现过的最大收益就是所求。
int maxp(vector<int> ve)
{
if (ve.size() < 2)
{
return 0;
}
int maxc = 0,i=0;
int curmin = ve[0];
for (i = 0; i < ve.size(); i++)
{
curmin = min(curmin, ve[i]);
maxc = max(maxc, ve[i]-curmin);
}
return maxc;
}
//II题目:用一个数组表示股票每天的价格,数组的第i个数表示股票在第i天的价格。交易次数不限,但一次只能交易一支股票,也就是说手上最多只能持有一支股票,求最大收益。
//分析:贪心法。从前向后遍历数组,只要当天的价格高于前一天的价格,就算入收益。
int maxp2(vector<int> ve)
{
if (ve.size() < 2)
{
return 0;
}
int maxc = 0, i = 0;
int curmin = ve[0];
for (i = 1; i < ve.size(); i++)
{
if (ve[i] - ve[i-1] > 0)
{
maxc += ve[i] - ve[i - 1];
}
}
return maxc;
}
//III用一个数组表示股票每天的价格,数组的第i个数表示股票在第i天的价格。最多交易两次,手上最多只能持有一支股票,求最大收益。
//分析:动态规划法。以第i天为分界线,计算第i天之前进行一次交易的最大收益preProfit[i],和第i天之后进行一次交易的最大收益postProfit[i],最后遍历一遍,max{ preProfit[i] + postProfit[i] } (0≤i≤n - 1)就是最大收益。第i天之前和第i天之后进行一次的最大收益求法同Best Time to Buy and Sell Stock I。
int maxp3(vector<int> ve)
{
if (ve.size() < 2)
return 0;
int n = ve.size();
int *pre=new int[n]();
int *post = new int[n]();
int curmin = ve[0], curmax = ve[n-1];
int i = 0,total=0;
for (i = 1; i < ve.size(); i++)
{
curmin = min(curmin, ve[i]);
pre[i]=(max(pre[i-1],ve[i]-curmin));
}
for (i = n - 2; i >= 0; i--)
{
curmax = max(curmax,ve[i]);
post[i]=(max(post[i+1],curmax-ve[i]));
}
for (i = 0; i < ve.size(); i++)
{
total = max(total, pre[i] + post[i]);
}
return total;
}
int main()
{
//vector<int> ve = { 7, 6, 8, 3, 4, -1, 9, -1, 10 };
vector<int> ve = {-2,-3,-3,-6,-1,-7};
int n = maxp3(ve);
cout << maxp3(ve) << endl;
}