夯实算法-买卖股票的最佳时机含手续费

70 阅读2分钟

题目:买卖股票的最佳时机含手续费

给定一个整数数组 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<=prices.length<=51041 <= prices.length <= 5 * 10^4
  • 1<=prices[i]<51041 <= prices[i] < 5 * 10^4
  • 0<=fee<51040 <= fee < 5 * 10^4

解题思路

如果当前的价格加手续费小于最后一次卖出的价格,则买入同时卖出, 如果当前价格大于最后想卖出但还没卖的价格时,则不卖出,且加入到收益中, 再维护最后想卖出的价格 也就是说最后想卖出的价格是分了两种情况进行考虑,有可能卖有可能继续维护不卖

遇到低价就买入,遇到高价,先计算利润,但并不是直接卖出,而是先持有该股票,以期获得更高的利润。 持有高价股票之后有三种情况: 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;
}

运行结果

Snipaste_2023-04-12_21-41-43.png

复杂度分析

  • 空间复杂度:O(1)O(1)
  • 时间复杂度:O(n)O(n)

掘金(JUEJIN) 一起分享知识, Keep Learning!