风口之下,猪都能飞。当今中国股市牛市,真可谓“错过等七年”。 给你一个回顾历史的机会,已知一支股票连续n天的价格走势,以长度为n的整数数组表示,数组中第i个元素(prices[i])代表该股票第i天的股价。 假设你一开始没有股票,但有至多两次买入1股而后卖出1股的机会,并且买入前一定要先保证手上没有股票。若两次交易机会都放弃,收益为0。 设计算法,计算你能获得的最大收益。 输入数值范围:2<=n<=100,0<=prices[i]<=100
Input: Output:
3,8,5,1,7,8 12
思路:
- 从cut_i 位置分为左右两部分分别求最大差值
- 差值为正,且最大值在最小值的右边
- 当只有两个数时,返回为最大差值为0
//从中间分开,分别找两边最大差值(小值在左大值在右)
int MaxDValue(vector<int> prices, int begin, int end)
{
//小值在左大值在右
int tmp1 = begin;
int tmp2 = begin;
int max = 0;
int div = 0;
for (; tmp1 <= end; tmp1++)
{
for (tmp2 = tmp1 + 1; tmp2 <= end; tmp2++)
{
div = prices[tmp2] - prices[tmp1];
max = max > div ? max : div;
}
}
return max;
}
int calculateMax(vector<int> prices)
{
int cut_i = 1;
int size = prices.size();
int max = 0;
int tmp = 0;
if (size <= 1)
return 0;
for (cut_i = 1; cut_i < size; cut_i++)
{
tmp = MaxDValue(prices, 0, cut_i) + MaxDValue(prices, cut_i, size - 1);
max = max > tmp ? max : tmp;
}
return max;
}
int main()
{
vector<int> ax = { 3, 8, 0, 1, 7, 8 };
cout << calculateMax(ax) << endl;
vector<int> ax1 = { 1,12 };
cout << calculateMax(ax1) << endl;
vector<int> ax2 = { 19, 5 };
cout << calculateMax(ax2) << endl;
system("pause");
return 0;
}