开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 4 天,点击查看活动详情
前言
算法的重要性不言而喻!区分度高!
现在学习的门槛低了,只有能上网每个人都可以学编程!培训班6个月就可以培养出来能干活的人,你怎么从这些人中脱颖而出?没错!就是学算法,学一些底层和基础的东西。
说的功利点是为了竞争,卷死对手。真心话说就是能提高自己的基础能力,为技术可持续发展做好充分的准备!!!
提前入门学习书籍:CPrimerPlus、大话数据结构
刷题网站
我是按照代码随想录提供的刷题顺序进行刷题的,大家也可以去刷leetcode最热200道,都可以
刷题嘛,最重要的就是坚持了!!!
画图软件
OneNote
这个要经常用,遇见不懂的流程的话就拿它画一画!
笔记软件
Typoral
题目
解析
因为我们做过买股票的那一题,所以这道题还是很好读懂的
在贪心算法: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;
}
}