leetcode 714买卖股票的最佳时机含手续费 贪心算法

给定一个整数数组prices,其中第i个元素代表了第i天的股票价格。整数fee代表了交易股票的手续费用。可以无限次的完成交易,但是每笔交易都需要付手续费。如果你已经购买一个股票,在卖出它之前你就不能再继续购买了。

返回获得利润的最大值。

输入: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

题解:

贪心算法:最低值买,最高值买。此处最高值应该考虑手续费。

买入日期:逢低买入。

卖出日期:只要当前价格大于最低价格加手续费,就可以卖出,并且要在连续获得利润区间的最后一天。

在做收获利润操作的时候有两种情况:

1.收获利润这一天并不是收获利润区间里的最后一天,所以并不是真正的卖出,相当于持有股票。所以后面要继续收获利润。

2.前一天是收获利润区间里的最后一天,相当于真正卖出了,今天要重新记录最小价格了。

代码如下:

class Solution {
public:
    int maxProfit(vector<int>& prices, int fee) {
        int result = 0;
        int minPrice = prices[0]; // 记录最低价格
        for (int i = 1; i < prices.size(); i++) {
            // 情况二:相当于买入
            if (prices[i] < minPrice) minPrice = prices[i]; 

            // 情况三:保持原有状态(因为此时买则不便宜,卖则亏本)
            if (prices[i] >= minPrice && prices[i] <= minPrice + fee) {
                continue;
            }

            // 计算利润,可能有多次计算利润,最后一次计算利润才是真正意义的卖出
            if (prices[i] > minPrice + fee) {
                result += prices[i] - minPrice - fee; 
                minPrice = prices[i] - fee; // 情况一,这一步很关键
            }
        }
        return result;
    }
};

从上述代码可以看出对情况一的操作,如果还在利润收获的区间,表示并不是真正的卖出。而计算利润每次都要减去手续费,所以要让minprice=price【i】-fee;这样在明天收获利润的时候,才不会多减一次手续费。

上一篇:Java 求解买卖股票的xx时机含手续费


下一篇:<> 第四版Exercise Section 8.4.1 练习题