给定一个整数数组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;这样在明天收获利润的时候,才不会多减一次手续费。