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

    先说点股票的事,对股票一无所知,我问明哥,比如说我今天10元买了个股票,明天11元,后天12元,那我后天是不是赚了3元?

    他说不是,股票只有卖了才有钱,也就是说后天卖了的话,赚2元。

    一般都会提到的算法是分治和动态规划(《剑指offer》中的第一种方法也很好,容易理解),动态规划后面再去实现,看到http://blog.csdn.net/iammiaoyan/article/details/11730059中说的另外一种感觉容易被忽视的方法(虽然很常见):要求最大的收益,自然是用最高的股票价格减去最低的价格即可,考虑到时间的因素,当前的收益一定是当天价格减去前面几天里的最低价格即可。

     1     //如果面试呗问到,一些东西需要当面问清楚,比如:如果最大收益是负值返回什么
     2     int maxProfit(vector<int> &prices) {
     3         int n=prices.size();
     4         if(n<=1)
     5             return 0;
     6         int i,min=prices[0],max_profit=0;
     7         for(i=1;i<n;++i){
     8             max_profit=(prices[i]-min)>max_profit?prices[i]-min:max_profit;
     9             min=prices[i]<min?prices[i]:min;
    10         }
    11         return max_profit;
    12     }

    AC

     1     int maxProfit(vector<int> &prices) {
     2         int n=prices.size();
     3         if(n<=1)
     4             return 0;
     5         int i,max;
     6         int a[n-1];//第二天的减去第一天的,表示增值
     7         int w[n-1];
     8         for(i=0;i<n-1;++i)
     9             a[i]=prices[i+1]-prices[i];
    10         w[0]=a[0];
    11         for(i=1;i<n-1;++i){
    12             if(w[i-1]<0)
    13                 w[i]=a[i];
    14             else
    15                 w[i]=w[i-1]+a[i];
    16         }
    17         max=w[0];
    18         for(i=1;i<n-1;++i)
    19             max=w[i]>max?w[i]:max;
    20         if(max<0)
    21             max=0;
    22         return max;
    23     }

    AC

    稍微优化一下

     1     int maxProfit(vector<int> &prices) {
     2         int n=prices.size();
     3         if(n<=1)
     4             return 0;
     5         int i,max_profit;
     6         int a[n-1];//第二天的减去第一天的,表示增值
     7         //int w[n-1];
     8         int pre;
     9         for(i=0;i<n-1;++i)
    10             a[i]=prices[i+1]-prices[i];
    11         pre=a[0];
    12         max_profit=a[0];
    13         for(i=1;i<n-1;++i){
    14             if(pre<0)
    15                 pre=a[i];
    16             else{
    17                 pre+=a[i];
    18                 max_profit=pre>max_profit?pre:max_profit;
    19             }
    20                 
    21         }
    22         if(max_profit<0)
    23             max_profit=0;
    24         return max_profit;
    25     }

    WA

    第13-19行错了,改为:

    1         for(i=1;i<n-1;++i){
    2             if(pre<0)
    3                 pre=a[i];
    4             else
    5                 pre+=a[i];
    6             max_profit=pre>max_profit?pre:max_profit;
    7                 
    8         }
  • 相关阅读:
    NPOIHelper.cs (NPOI 2.1.1)
    使用哈希加盐法来为密码加密【转】
    让普通控件拥有左键移动窗体的功能
    Reflector反编译.NET文件后修复【转】
    SD卡中FAT32文件格式快速入门(图文详细介绍)【转】
    项目管理知识体系指南(PMBOOK指南)(第5版) 阅读摘要
    数学
    位运算小结
    字符串(1)——Detect Capital
    数组和矩阵(3)——Next Greater Element I
  • 原文地址:https://www.cnblogs.com/crane-practice/p/3616813.html
Copyright © 2011-2022 走看看