标签:
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