LintCode:1000. 買賣股票的最佳時機含手續費
阿新 • • 發佈:2018-12-10
描述
現在給出一個數組,包含一系列價格,其中第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、多用數學工具/邏輯思考問題