1. 程式人生 > >LintCode:1000. 買賣股票的最佳時機含手續費

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、多用數學工具/邏輯思考問題