题目描述
在股市的交易日中,假设最多可进行两次买卖(即买和卖的次数均小于等于2),规则是必须一笔成交后进行另一笔(即买-卖-买-卖的顺序进行)。给出一天中的股票变化序列,请写一个程序计算一天可以获得的最大收益。请采用实践复杂度低的方法实现。
给定价格序列prices及它的长度n,请返回最大收益。保证长度小于等于500。
测试样例:
[10,22,5,75,65,80],6
返回:87
实现算法:
时间复杂度:O(n2)
空间复杂度:常数
1 class Stock { 2 public: 3 //两个下标,从头开始,一个在前一个在后; 4 //如果后边值大于前边,更新结果;否则,后边下标更新成为前边 5 //总之,要让小的始终处于后边 6 int getOnce(vector<int> &p, int l, int r) 7 { 8 if(l >= r) 9 return 0; 10 int ans = INT_MIN; 11 int i = l, j = i+1; 12 while(j <= r) 13 { 14 if(p[j] > p[i]) 15 ans = max(ans, p[j]-p[i]); 16 else 17 i = j; 18 j++; 19 } 20 return ans; 21 } 22 //分治,更新最大值(两次 >= 一次) 23 int maxProfit(vector<int> prices, int n) { 24 if(n <= 1) 25 return 0; 26 int res = 0; 27 for(int i=1; i<n; i++) 28 { 29 int preProfit = getOnce(prices, 0, i); 30 int postProfit = getOnce(prices, i+1, n-1); 31 int tmp = preProfit + postProfit; 32 res = max(res, tmp); 33 } 34 return res; 35 } 36 };