714. 买卖股票的最佳时机含手续费+贪心

https://leetcode.cn/problems/best-time-to-buy-and-sell-stock-with-transaction-fee/

题目要求

给定一个整数数组 prices,其中 prices[i]表示第 i 天的股票价格 ;整数 fee 代表了交易股票的手续费用。

你可以无限次地完成交易,但是你每笔交易都需要付手续费。如果你已经购买了一个股票,在卖出它之前你就不能再继续购买股票了。

返回获得利润的最大值。

注意:这里的一笔交易指买入持有并卖出股票的整个过程,每笔交易你只需要为支付一次手续费。

贪心

class Solution {
    public int maxProfit(int[] prices, int fee) {
        int n = prices.length;
        int[] value = new int[n - 1];
        for (int i = 1; i < n; i++) {
            value[i - 1] = prices[i] - prices[i - 1];
        }
        int len = value.length;
        int cur = 0, res = 0;
        for (int i = 0; i < len; i++) {
            if (value[i] > 0) cur += value[i];
            else {
                res += Math.max(cur - fee, 0);
                cur = 0;
            }
        }
        return res;
    }
}
  • 贪心的思想在这里更难以理解一些;
  • 首先我们遍历数组的时候,是需要记录下当前时刻之前的最小价格买入股,以保证我手里的股票是以最低价格买入的。
  • 其次,当遇到本次股票可以让我获利时,我就收割本次利润,并且把购买成本换成本次股票价钱。关键点来了,为什么要有把购买成本换成本次股票价钱这一步操作呢,因为本次利润只是收割,我并没有真正的把我手上的股票的卖出去(如果卖出去,那成本应该重置为0,并且你下一次再想买进的话就需要再付一次手续费了)。
  • 为什么这样做呢,拿prices = [1,3,7,5,10,3], fee = 3 举例。显而易见我们应该在第一天买入保证我的最低成本为1+3=4,然后我在遍历到7的时候应该卖出去了,因为它可以让我获得7-4=3的利润,但是此时要不要真的卖呢,我不知道。再往后遍历,遇到了10。两种情况
    • 我在7的时候真卖了 那我就需要在5的时候购入成本为5+3=8
    • 我在7的时候假卖,成本为7,(前面说了假卖的时候要把成本换成本次价钱)。也可以理解为假卖就是没卖,成本为1+3=4,利润为10-4=6。 显而易见我假卖的话可以收获更多,这就是贪心
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值