LeetCode每日1题--714. 买卖股票的最佳时机含手续费

81 阅读3分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 4 天,点击查看活动详情

前言

算法的重要性不言而喻!区分度高!

现在学习的门槛低了,只有能上网每个人都可以学编程!培训班6个月就可以培养出来能干活的人,你怎么从这些人中脱颖而出?没错!就是学算法,学一些底层和基础的东西。

说的功利点是为了竞争,卷死对手。真心话说就是能提高自己的基础能力,为技术可持续发展做好充分的准备!!!

提前入门学习书籍:CPrimerPlus、大话数据结构

image-20220705103735001

刷题网站

代码随想录 (programmercarl.com)

leetcode

我是按照代码随想录提供的刷题顺序进行刷题的,大家也可以去刷leetcode最热200道,都可以

刷题嘛,最重要的就是坚持了!!!

画图软件

OneNote

这个要经常用,遇见不懂的流程的话就拿它画一画!

笔记软件

Typoral

题目

leetcode.cn/problems/be…

image.png

解析

因为我们做过买股票的那一题,所以这道题还是很好读懂的

贪心算法:122.买卖股票的最佳时机II (opens new window)中使用贪心策略不用关心具体什么时候买卖,只要收集每天的正利润,最后稳稳的就是最大利润了。

而本题有了手续费,就要关系什么时候买卖了,因为计算所获得利润,需要考虑买卖利润可能不足以手续费的情况

如果用贪心策略,就是低买,高卖(如果算上手续费还盈利)

此时无非就是要找到两个点,买入日期,和卖出日期。

  • 买入日期:遇到最低点记录下来
  • 卖出日期:只要当前价格大于买入价格和手续费,就是赚钱的,具体的卖出日期,就是能一直赚钱区间里的最后一天

所以我们只需要关心三种情况

  • 情况一:收回利润的时候不是利润区间的最后一天,继续持有股票不卖。
  • 情况二:收回利润的时候是利润区间的最后一天,卖掉,并重新记录最小买入价格
  • 情况三:不操作

有了上面的思路,用代码去实现就可以了

int buy = prices[0] + fee;记录买入价格

对股票价格进行遍历,同时进行判断

  • 如果股票价格加手续费小于买入价格,更新该价格为买入价格
  • 如果股票价格大于买入价格(挣钱的情况),那就记录一下利润(股票价格-买入价格),买入价格更新为股票价格
  • 返回记录的利润
for (int p : prices) {
    if (p + fee < buy) {
        buy = p + fee;
    } else if (p > buy){
        sum += p - buy;
        buy = p;
    }
}

我们可能发现没有等于的情况,等于的情况我们不操作,因为我们要找最大利润,股票价格有波动的话我们不操作,所以代码中可以不写

完整代码

看不懂?没办法,多写多练多总结!

还是带入代码到示例中多去总结多练习!

class Solution {
    public int maxProfit(int[] prices, int fee) {
        int buy = prices[0] + fee;
        int sum = 0;
        for (int p : prices) {
            if (p + fee < buy) {
                buy = p + fee;
            } else if (p > buy){
                sum += p - buy;
                buy = p;
            }
        }
        return sum;
    }
}