zoukankan      html  css  js  c++  java
  • 714. Best Time to Buy and Sell Stock with Transaction Fee

    做了下这个题, 感觉自己还是很菜,竟然还要看答案

    这个题目告诉你股票价格,计算怎么交易收入最大;毫无疑问, 最低点买入,最高点卖出

    先上答案;

     1     int maxProfit(vector<int>& prices, int fee) {
     2         int income=0;
     3         int cost=-prices[0];
     4         for(int i=1;i<prices.size();++i)
     5         {
     6             income=max(prices[i]+cost-fee,income);//收入=max(今天卖出,今天不卖出)
     7             cost=max(cost,income-prices[i]); 余额=max(今天不做操作,今天买入)
     8         }
     9         return income;
    10     }

    第一次看这个答案,都完全不理解,菜鸡就是菜鸡。。 现在记录一下这个答案的详细解说,如果你跟我一样是个菜鸡, 应该也能看懂;

    以下图解假设手续费为0,减小干扰

    先解释下用到的两个变量: cost 每一天我的余额,income 每一天如果卖出股票能挣多少钱

    第一天, 初始化, 收入=0; 余额=今天买入=-1  , 注意这里一定记为买入的情况,不然后面没法比较

     

    第二天,股票涨到3块,收入=max(今天卖出=3-1=2,今天不操作=0)= 2, 余额=max(不操作=-1,买入今天股票=2-3=-1),两者相等都是-1;

    开始我对这里产生了疑问,收入和余额都会做赋值,会不会乱套?

    收入=max(卖出,不卖出)

    余额=max(买入,不买入)

    那么岂不是四种组合?

    然后一想,理论上是,但实际上并不会发生4种,只会有两种  卖出+不买入   和   不卖+买入 , 而这两种也是符合题目条件和实际情况的,

    另外两种组合   卖出+买入,  不卖出+不买入  不会发生

    分析下为什么只会发生两种;

    如果今天的价格较高,那么 执行 收入=max(卖出,不卖出) 时,会命中左边条件,也就是 收入=卖出 ,并且 余额=max(买入,不买入)  也会命中右边条件,也就是余额=不买入;非常神奇。。

    同理,如果今天价格很低, 两个等式会命中相反的价格;

    所以这种写法表面上给人有4种组合的感觉,其实不是;估计是大神进行优化的代码写法,两行就搞定了;

    下面是我自己还原的代码,逻辑上好理解;

        int maxProfit(vector<int>& prices, int fee) {
            int income=0; 初始收益为0
            int cost=-prices[0]; 初始余额为第一天股价 x -1
            for(int i=1;i<prices.size();++i)
            {
                int sell=prices[i]+cost-fee; // 先检查今天卖出收益是多少;这步要先做
                if(sell>income) 如果比昨天卖出要高,用今天的结果刷新昨天的值
                {
                    income=sell;
                    continue; 无需检查余额
                }
                cost=max(cost,income-prices[i]); 如果今天不适合卖出(不卖出有两种情况,股价走低或者股价变高但不足以支付手续费),再看要不要买入;买入标准,用收入减股价是否比余额要多
            }
            return income;
        }

    再往后的图就不画了,其实后面的天数循环逻辑和第二天都是一样的了,只要第二天的逻辑清楚就行了;


    深度思考,这个题本质是什么?

    在我琢磨了好久之后, 这个题其实压根和股票没有卵关系...

    这个题在不考虑手续费的情况下, 不就是让你找出所有的连续递增子数组么!!!!

  • 相关阅读:
    C# 开发(创蓝253)手机短信验证码接口
    33条C#、.Net经典面试题目及答案
    请用一句sql语句取出各科的平均成绩,显示字段,科目,平均成绩
    写出一条Sql语句:取出表A中第31到第40记录(SQLServer,以自动增长的ID作为主键,注意:ID可能不是连续的。
    SQL的四种连接-左外连接、右外连接、内连接、全连接
    C# 获取mp3文件的歌曲时间长度
    欧拉公式
    linux环境java入门
    C内存分配
    机器学习网址归纳
  • 原文地址:https://www.cnblogs.com/lychnis/p/9163446.html
Copyright © 2011-2022 走看看