题目:

今天是正式开始独立思考动态规划解题的日子。

这题拿到手的时候,我第一时间其实想到的就是动态规划,去找他每天最大收益状态,但是想来想去发现行不通,于是就作弊看答案了,发现是使用双状态的方法考虑的。

答案是这么考虑这个问题的:

1.每天的状态分为持有和不持有股票两种状态。而今日收益肯定就是这两种状态的其中一种,所以只要写出这两种状态的状态转移方程即可。

2.首先对于今天交易结束以后不持有股票的收益,存在两种情况,第一种,是延续昨天的不持有股票,或者是今天将股票卖出了。
那么今天不持有股票状态的收益就应该是:

(1)昨天不持有股票的收益

(2)今天持有昨天的股票但是卖出了的收益

这两项收益值最大的那个

3.对于今天交易结束以后持有股票的收益,同样也存在两种情况,第一种是延续昨天持有股票,或者是今天买入了。其它的同理2

写代码的时候,发现评论区有一个大神的代码写的比官方题解更好,不需要二维数组那么复杂的操作,因为只有两个变量需要更改,暂存就可以了

C++代码:(附带测试)

#include<iostream>
#include<vector>
using namespace std;class Solution {public:int maxProfit(vector<int>& prices, int fee) {if (prices.empty() || fee < 0) return 0;int n = prices.size();// 每天的股票状态分为: 持有 vs 不持有;// 今天的持有状态收益: from max {昨天的持有状态保持不动, 昨天未持有今天买入 }// 今天的不持有状态收益: from max {昨天的不持有状态保持不动, 昨天持有今天卖掉 }int noHold = 0, hold = -prices[0];  // 第1天;int tmp = 0; // 存储临时值;for (int i = 1; i < n; ++i) {tmp = hold;// 保持昨天的持有状态过渡 或者 昨天不持有那今天一定得买[持有];hold = max(hold, noHold - prices[i]);// 保持昨天的不持有状态过渡 或者 昨天持有那今天一定得卖掉[不持有];noHold = max(noHold, tmp + prices[i] - fee);}return noHold;  // 返回最后一天不持有股票的累计利润;}
};int main()
{vector<int> prices = {1, 3, 2, 8, 4, 9};int fee = 2;Solution s;cout<<s.maxProfit(prices,fee);
}

贪心的思想也很有意思,我一开始本来觉得这条路是行不通的。

官方题解浓缩的很好:
当我们卖出一支股票时,我们就立即获得了以相同价格并且免除手续费买入一支股票的权利

什么意思呢?就是我们希望我们每次卖出股票获得的收益都必须大于等于收益值。但是由于贪心算法会在大于手续费的收益时就选择卖出,所以还需要一个细节的处理,即minPrice = prices[i] - fee,这样在之后收获利润的时候,才不会多计算一次手续费

C++代码:

class Solution {public:int maxProfit(vector<int>& prices, int fee) {int n = prices.size();int buy = prices[0] + fee;int profit = 0;for (int i = 1; i < n; ++i) {if (prices[i] + fee < buy) {buy = prices[i] + fee;}else if (prices[i] > buy) {profit += prices[i] - buy;buy = prices[i];//这里是最关键的细节}}return profit;}
};作者:LeetCode-Solution
链接:https://leetcode-cn.com/problems/best-time-to-buy-and-sell-stock-with-transaction-fee/solution/mai-mai-gu-piao-de-zui-jia-shi-ji-han-sh-rzlz/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

【LeetCode刷题笔记-39 714.买卖股票的最佳时机(含手续费)】相关推荐

  1. 【Leetcode刷题Python】714. 买卖股票的最佳时机含手续费

    1 题目 给定一个整数数组 prices,其中 prices[i]表示第 i 天的股票价格 :整数 fee 代表了交易股票的手续费用. 你可以无限次地完成交易,但是你每笔交易都需要付手续费.如果你已经 ...

  2. Leetcode刷题笔记 714. 买卖股票的最佳时机含手续费

    714. 买卖股票的最佳时机含手续费 时间:2020年12月17日 知识点:动态规划 题目链接:https://leetcode-cn.com/problems/best-time-to-buy-an ...

  3. 【LeetCode每日一题】——714.买卖股票的最佳时机含手续费

    文章目录 一[题目类别] 二[题目难度] 三[题目编号] 四[题目描述] 五[题目示例] 六[解题思路] 七[题目提示] 八[时间频度] 九[代码实现] 十[提交结果] 一[题目类别] 贪心算法 二[ ...

  4. 力扣刷题day32|738单调递增的数字、714买卖股票的最佳时机含手续费、968监控二叉树

    文章目录 738. 单调递增的数字 思路 难点:遍历顺序 难点:设置flag 714. 买卖股票的最佳时机含手续费 贪心思路 难点 968. 监控二叉树 思路 难点:如何隔两个节点放一个摄像头 738 ...

  5. 力扣刷题day44|309最佳买卖股票时机含冷冻期、714买卖股票的最佳时机含手续费

    文章目录 309. 最佳买卖股票时机含冷冻期 思路 动态规划五部曲 714. 买卖股票的最佳时机含手续费 贪心思路 难点 动态规划思路 动态规划五部曲 309. 最佳买卖股票时机含冷冻期 力扣题目链接 ...

  6. 【算法】贪心算法:LeetCode 714 买卖股票的最佳时机含手续费 、LeetCode 968 监控二叉树

    LeetCode 714 买卖股票的最佳时机含手续费 (中等) 题目 描述 给定一个整数数组 prices,其中第 i 个元素代表了第 i 天的股票价格 :整数 fee 代表了交易股票的手续费用. 你 ...

  7. 模拟卷Leetcode【普通】714. 买卖股票的最佳时机含手续费

    714. 买卖股票的最佳时机含手续费 给定一个整数数组 prices,其中第 i 个元素代表了第 i 天的股票价格 :整数 fee 代表了交易股票的手续费用. 你可以无限次地完成交易,但是你每笔交易都 ...

  8. 【贪心算法】Leetcode 714. 买卖股票的最佳时机含手续费

    [贪心算法]Leetcode 714. 买卖股票的最佳时机含手续费 题目 给定一个整数数组 prices,其中 prices[i]表示第 i 天的股票价格 :整数 fee 代表了交易股票的手续费用. ...

  9. LeetCode 714 买卖股票的最佳时机含手续费

    714. 买卖股票的最佳时机含手续费 题目 思路 过一遍,记录第i天是否买入和卖出的最值. 代码 class Solution {public:int maxProfit(vector<int& ...

最新文章

  1. go chapter 8 - 初始化对象
  2. java URI 与URL问题
  3. Spring MVC modelandview
  4. powershell 备份文件脚本
  5. [网络安全自学篇] 十六.Python攻防之弱口令、自定义字典生成及网站防护
  6. 阿里P7架构师要求:Web核心+开源框架+大型网站架构!含面试题目!
  7. 利用rman配置DG环境
  8. 希尔排序增量怎么确定_Python实现希尔排序(已编程实现)
  9. Flutter 系列文章:Flutter Text 控件介绍
  10. 100+诡异的数据集,20万Eclipse Bug、死囚遗言等
  11. python 机器学习——从感知机算法到各种最优化方法的应用(python)
  12. Android资料之-EditText中的inputType
  13. I2C总线协议原理介绍
  14. php709,深度爆料评测bt2020与bt709有什么区别?哪个好?良心点评实际情况
  15. Python+OpenCV摄像头人脸识别
  16. 搜索结果Refinement 行为总结之 multi-selection refinement
  17. uclinux + nios (UCLinux在NIOS上的移植)
  18. Person ReID最新论文推荐
  19. Robin一个专注开发者的组织
  20. 3GPP R16 TSN 时间同步相关的能力提升

热门文章

  1. 一文看懂苹果WWDC20:iOS 14更好玩,可Intel要哭瞎了
  2. SEO批量文章繁简转换,同义词替换
  3. Win10系统电脑连接打印机的设置方法
  4. [转]office2010一直卡在“正在受保护的视图中打开”
  5. 1. Java POI 读取、写入Excel(包括样式)的工具类Utils
  6. 使用Python下载蓝奏云文件
  7. 双臂电桥测低电阻大物实验数据处理(C++实现)
  8. 【短期】未来学习目标
  9. bitnami redmine 4 windows一键式版本安装企业微信插件方法
  10. 科学计算机复利现值怎么计算公式,怎么用科学计算器算年金现值和复利现值是那个......