zoukankan      html  css  js  c++  java
  • 股票收益问题

    1、买卖股票的最佳时机 I

    注意:只能买卖一次股票,求最大利润

    思路:需要找出给定数组中两个数字之间的最大差值(即,最大利润)。此外,第二个数字(卖出价格)必须大于第一个数字(买入价格)。

    状态转移方程:res = max(res, prices[i] - minpri);,res为前i天的最大收益,minpri为前i天的最小值。
    初始化状态量:res = 0;, minpri = prices[0];

     int maxProfit(vector<int>& prices) {
            if(prices.size()==0){
                return 0;
            }
            int res=0;
            int minpri=prices[0];
            for(int i=1;i<prices.size();i++){
                if(prices[i]<minpri){
                    minpri=prices[i];
                }
                res=max(res, prices[i]-minpri);
            }
            return res;
        }
     

    给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格。

    设计一个算法来计算你所能获取的最大利润。你可以尽可能地完成更多的交易(多次买卖一支股票)。

    注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。

    分析:不限制交易次数,其实看起来比 I 还要简单,可以直接一次遍历,把后一项大于前一项时,两者差值相加即可。

    int maxProfit(vector<int>& prices) {
      if(prices.size()==0){
        return 0;
      }
      int res=0;
      for(int i=1;i<prices.size();i++){
        if(prices[i]>prices[i-1]){
        res+=prices[i]-prices[i-1];
        }
      }
      return res;
    }

    3、买卖股票的最佳时机 III

    给定一个数组,它的第 i 个元素是一支给定的股票在第 i 天的价格。

    设计一个算法来计算你所能获取的最大利润。你最多可以完成 两笔交易。

    注意: 你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。

    分析:最多交易两次

    利用双指针进行求解,分别定义两个容器f和b,f[i]代表从前往后在第i天进行一次交易的交易利润最大值;而b[i]代表从后往前交易到第i天的利润最大值,在求解完成后,进行比较交易两次还是交易一次利润最大(最多交易两次),最后返回利润最大值。
    f[i]=max(f[i-1],prices[i]-min_price);
    b[i]=mmax(b[i+1],max_price-prices[i]);

    int maxProfit(vector<int>& prices) {
            if(prices.size()==0) return 0;
            int n=prices.size();
            vector<int> f(n);
            vector<int> b(n);
            
            int min_price=prices[0];
            for(int i=1;i<n;i++){
                f[i]=max(f[i-1],prices[i]-min_price);
                min_price=min(prices[i],min_price);
            }

            int max_price=prices[n-1];
            for(int i=n-2;i>=0;i--){
                b[i]=max(b[i+1],max_price-prices[i]);
                max_price=max(max_price,prices[i]);
            }

            int res=0;
            for(int i=0;i<n-1;i++){
                res=max(res,max(f[i]+b[i+1],f[i]));
            }
            res=max(res,f[n-1]);
            return res;
        }

    4、买卖股票的最佳时机含手续费

    /*dp1[i]表示第i天手上有股票,dp2[i]表示第i天手上没有股票,
    递归方程:
    dp1[i] = max(dp1[i-1], dp2[i-1] - prices[i]) (第二项表示在第i天买入股票)
    dp2[i] = max(dp2[i-1], dp1[i-1] + prices[i] - fee) (第二项表示在第i天将股票卖出,需扣除手续费)*/
    int maxProfit(vector<int>& prices, int fee) {
      int n=prices.size();
        if(n==0){
        return -1;
      }
      vector<int>dp1(n);
      vector<int>dp2(n);
      dp1[0]=-prices[0];
      dp2[0]=0;
      for(int i=1;i<n;i++){
        dp1[i]=max(dp1[i-1], dp2[i-1]-prices[i]);
        dp2[i]=max(dp2[i-1], dp1[i-1]+prices[i]-fee);
      }
      return dp2[n-1];
    }

  • 相关阅读:
    迷宫寻宝(自编简单版)
    推荐一个免费翻译接口
    nyoj 82
    poj 3984
    Suffix Tree(后缀树)
    python turtle模块绘图
    python continue语句
    python break语句
    pycharm永久破解激活码
    python while死循环
  • 原文地址:https://www.cnblogs.com/sunshine1218/p/12251620.html
Copyright © 2011-2022 走看看