leetcode 動態規劃 買賣股票的最佳時機含手續費 java

stonney發表於2020-11-22

題目描述
給定一個整數陣列 prices,其中第 i 個元素代表了第 i 天的股票價格 ;非負整數 fee 代表了交易股票的手續費用。

你可以無限次地完成交易,但是你每筆交易都需要付手續費。如果你已經購買了一個股票,在賣出它之前你就不能再繼續購買股票了。

返回獲得利潤的最大值。

注意:這裡的一筆交易指買入持有並賣出股票的整個過程,每筆交易你只需要為支付一次手續費。

示例 1:

輸入: prices = [1, 3, 2, 8, 4, 9], fee = 2
輸出: 8
解釋: 能夠達到的最大利潤:
在此處買入 prices[0] = 1
在此處賣出 prices[3] = 8
在此處買入 prices[4] = 4
在此處賣出 prices[5] = 9
總利潤: ((8 - 1) - 2) + ((9 - 4) - 2) = 8.

方法一:
可以使用“最佳買賣股票時機含冷凍期”中的方法,有兩個狀態,buy[i]和sell[i] ,區別是:
1.沒有冷凍期,所以可以在第i-1天賣出之後,在第i天繼續買
2.賣出股票的時候需要減去手續費


class Solution {
    public int maxProfit(int[] prices, int fee) {
        int len = prices.length;
        if(len <= 1){
            return 0;
        }
        int buy[] = new int[len];
        int sell[] = new int[len];
        buy[0] = -prices[0];
        sell[0] = 0;
        buy[1] = Math.max(buy[0],-prices[1]);
        sell[1] = Math.max(sell[0],buy[0]+prices[1]-fee);
        for(int i = 2;i<len;i++){
            buy[i] = Math.max(buy[i-1],sell[i-1]-prices[i]);
            sell[i] = Math.max(sell[i-1],buy[i-1]+prices[i]-fee);
        }
        return sell[len-1];

    }
}

方法二:
與上面的思路一樣,但是隻有兩個變數,buy和sell

class Solution {
    public int maxProfit(int[] prices, int fee) {
        int buy = -prices[0];
        int sell = 0;
        for(int i = 1;i < prices.length;i++){
            sell = Math.max(sell,buy+prices[i]-fee);
            buy = Math.max(buy,sell - prices[i]);
        }
        return sell;
    }
}

相關文章