LintCode:1000. 买卖股票的最佳时机含手续费

描述

现在给出一个数组,包含一系列价格,其中第i个元素是一支股票在第i天的价格;一个非负数fee代表了手续费。

你可以根据需要任意地进行交易,但是每次交易都必须付手续费。每次购买不能超过1股(必须在再次购买的之前卖出股票)。

返回可以获得的最大利润。

dalao思路:也有动态规划的解法,但这里使用贪心的解法

选择的关键是找到一个最大后是不是能够卖掉stock,重新开始寻找买入机会。比如序列1 3 2 8,如果发现2小于3就完成交易买1卖3,此时由于fee=2,(3-1-fee)+(8-2-fee)<(8-1-fee),所以说明卖早了,令max是当前最大price,当(max-price[i]>=fee)时可以在max处卖出,且不会存在卖早的情况,再从i开始重新寻找买入机会。

 public int maxProfit(int[] prices, int fee) {
        // write your code here
        //转自https://blog.csdn.net/zw159357/article/details/82260077
       int n=prices.length;
        if(n<=1)
            return 0;
        int p=0,curP=0;
        int minP=prices[0],maxP=prices[0];
        for(int i=1;i<n;i++){
           minP=Math.min(minP,prices[i]);
           maxP=Math.max(maxP,prices[i]);
           curP=Math.max(curP,prices[i]-minP-fee);
           if(maxP-prices[i]>=fee){
               p+=curP;
               curP=0;
               maxP=prices[i];
               minP=prices[i];
           }
        }
        return p+curP;

        
    }

summary:1、贪心策略就是寻找当前最佳买卖时机,就是判断一段时间内的所有股票,是进行一次交易的利润大,还是进行两次(这里可以由两次推到多次)的利润大,即max-price[i]>=fee,之前一直在想这个判断条件怎么推出来的,用纸写写发现由简单的数学逻辑推导出来。(b-a-fee + d-c-fee > d-a-fee)也可以理解为当maxP比price[i]赚的多于手续费时,就可以卖出,否则就不值得卖,而curp一直对应于maxP - minP - fee

2、多用数学工具/逻辑思考问题

猜你喜欢

转载自blog.csdn.net/qq_38702697/article/details/82762654