股票交易日

题目描述

在股市的交易日中,假设最多可进行两次买卖(即买和卖的次数均小于等于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 };
posted @ 2019-08-23 10:27  yocichen  阅读(275)  评论(0编辑  收藏  举报