zoukankan      html  css  js  c++  java
  • Best Time to Buy and Sell Stock III

    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 }
     
  • 相关阅读:
    鼠标划过出现子菜单
    让dedecms(织梦)的list标签支持weight排序
    win7 64位无法安装网络打印机
    点击外部链接, 让iframe父页面也跟着显示
    C/C++指针(转)
    OO与设计模式的原则、目标 (转)
    页面添加QQ
    Windows Form 中的鼠标事件
    深入浅出C#消息
    初始化列表
  • 原文地址:https://www.cnblogs.com/xiaoyesoso/p/4455522.html
Copyright © 2011-2022 走看看