码迷,mamicode.com
首页 > 其他好文 > 详细

Best Time to Buy and Sell Stock III

时间:2015-04-25 12:01:16      阅读:181      评论:0      收藏:0      [点我收藏+]

标签:

Best Time to Buy and Sell Stock III

 Total Accepted: 30820 Total Submissions: 130535My Submissions

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 most two transactions.

Note:
You may not engage in multiple transactions at the same time (ie, you must sell the stock before you buy again).

 

 1 #include <vector>
 2 #include <iostream>
 3 using namespace std;
 4 
 5 
 6 int main()
 7 {
 8     int priSize ,tem,i;
 9     vector<int> pri;
10     while(cin >> priSize)
11     {
12         pri.clear() ;
13         for( i =  0; i < priSize ; ++ i)
14         {
15             cin >> tem ;
16             pri.push_back(tem);
17         }
18 
19         if(priSize<=1) 
20         {
21             cout << 0 << endl;
22             continue;
23         }
24         if(priSize==2)  
25         {
26             int tem = pri[1]>pri[0]?pri[1]-pri[0]:0;
27             cout << tem << endl;
28             continue;
29         }
30 
31 
32         //第一种情况,只买了一次
33         // 1、从左到右遍历 保存最小价格MIN ,判断 pri[i] - MIN > MaxPrice ? ,更新 当前最大利润 MaxPrice
34         // 2、从左到右遍历 保存最大价格MAX ,判断 MAX - pri[i] > MaxPrice ? ,更新 MaxPrice
35 
36         //第二种情况,买了两次
37         //3、max( d ) = MaxPrice( 0 <= d <= i ) + MaxPrice( i < d < priSize ) 
38         //d  在 0 < d < priSize - 1 之间遍历 ,判读 max( d ) > MaxPrice , 更新 MaxPrice
39         //MaxPrice( 0 <= d <= i ) 和   MaxPrice( i < d < priSize )   的结果
40         //可以在 第 1、2 步 在 maxFromLeft,maxFromRight 预先记录下来
41         //4、maxFromLeft[priSize-1] == maxFromRight[0] == 总共只买一次的最大利润
42         //用它们之中的一个来 和 第 3、中的 MaxPrice 比较大小,得出结果
43 
44 
45         //算法复杂度 O( n-1 +  n-1 + n - 2 ) = O(3n - 4) = O( n ) 
46 
47         vector<int> maxFromLeft(priSize,0);    
48         vector<int> maxFromRight(priSize,0);
49         int MIN = INT_MAX, MAX=INT_MIN, MaxPrice = INT_MIN,priTem;
50         for(int i=0;i<priSize;i++)
51         {
52             //更新从左边开始的最小价格
53             if(pri[i]<MIN)
54                 MIN = pri[i];
55             priTem = pri[i]- MIN;
56 
57             //更新当前最大盈利
58             if(priTem > MaxPrice)
59                 MaxPrice = priTem;
60 
61             //保存 MaxPrice( 0 <= d <= i )
62             maxFromLeft[i] = MaxPrice;
63         }
64 
65         MaxPrice = INT_MIN ;
66         for(int i=priSize-1;i>=0;--i)
67         {
68             //更新从右边开始的最大价格
69             if(pri[i]>MAX)
70                 MAX = pri[i];
71             priTem = MAX - pri[i];
72             //更新当前最大盈利
73             if(priTem > MaxPrice)
74                 MaxPrice = priTem;
75             //保存  MaxPrice( i < d < priSize )
76             maxFromRight[i] = MaxPrice;
77         }
78 
79         MaxPrice = INT_MIN ;
80         for(int i=0;i<priSize-1;i++){
81             //更新当前最大盈利
82             priTem = maxFromLeft[i]+maxFromRight[i+1];
83             if(priTem > MaxPrice) MaxPrice = priTem;
84         }
85 
86         //maxFromLeft[priSize-1] 和  MaxPrice 比较大小,得出结果
87         if( maxFromLeft[priSize-1] > MaxPrice )
88             MaxPrice = maxFromRight[0];
89 
90         cout << MaxPrice << endl;
91     }
92 
93     return 0 ;
94 }

 

 

Best Time to Buy and Sell Stock III

标签:

原文地址:http://www.cnblogs.com/xiaoyesoso/p/4455522.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!