题目:买卖股票的最佳时机含手续费
给定一个整数数组 prices
,其中 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
示例 2:
输入: prices = [1,3,7,5,10,3], fee = 3
输出: 6
提示:
解题思路
如果当前的价格加手续费小于最后一次卖出的价格,则买入同时卖出, 如果当前价格大于最后想卖出但还没卖的价格时,则不卖出,且加入到收益中, 再维护最后想卖出的价格 也就是说最后想卖出的价格是分了两种情况进行考虑,有可能卖有可能继续维护不卖
遇到低价就买入,遇到高价,先计算利润,但并不是直接卖出,而是先持有该股票,以期获得更高的利润。 持有高价股票之后有三种情况: 1、某日的股价比我当前持有的股票还要高时,那么我们就将卖出日期换成该日,以获得更高的利润,同时避免多交一次手续费 2、某日的股价+手续费 低于我当前持有的股票时,p_low=p+fee < buy,那么如果后面某一个的股价 p_high > buy时,我们能收获的利润: p_high - buy < p_high - p_low。
代码实现
// 交易次数最小,且股价差值最大
public int maxProfit(int[] prices, int fee) {
int count = 0;
int buy = prices[0] + fee;
for (int p: prices) {
if (p + fee < buy) { // 低价买入
buy = p + fee;
} else if (p > buy) { // 今天的股价大于买入价格和手续费之和时
count += p - buy;
buy = p;
}
}
return count;
}
运行结果
复杂度分析
- 空间复杂度:
- 时间复杂度:
在掘金(JUEJIN) 一起分享知识, Keep Learning!