股票类问题(动态规划)


题目详情

给定一个整数数组 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

思路:
股票类问题的一类(含手续费),我们同样得可以画出状态机转换图:


dp[i][0]表示第i天手里没股票的状态
dp[i][1]表示第i天手里有股票的状态
初始化好第0天的状态即可遍历每天的股票更新dp,详细代码如下:

我的代码:

class Solution
{public:int maxProfit(vector<int>& prices, int fee) {int n = prices.size();vector<vector<int>> dp(n, vector<int>(2));dp[0][0] = 0, dp[0][1] = -prices[0]; //初始化for (int i = 1; i < n; ++i){//无股票状态       昨天无股票       昨天有股票卖了    dp[i][0] = max(dp[i - 1][0], dp[i - 1][1] + prices[i] - fee);//有股票状态       昨天有股票       昨天买入的股票    dp[i][1] = max(dp[i - 1][1], dp[i - 1][0] - prices[i]);}return dp[n - 1][0];}
};

可以看出,我们利用了vector存储了各个状态,但是状态dp[i]只取决于dp[i-1],显然O(n)空间复杂度太过繁杂,我们可以用两个变量来存储状态,从而得到下面代码:

class Solution
{public:int maxProfit(vector<int>& prices, int fee) {int n = prices.size();int sell = 0, buy = -prices[0];for (int i = 1; i < n; ++i) {sell = max(sell, buy + prices[i] - fee);buy = max(buy,sell - prices[i]);}return sell;}
};

本道题还可以利用贪心的策略:
贪心策略:保证以最低价买入股票(用一个变量存储这个最低价格),最高价卖出股票
因为最高价无法保证,所以我们只要找到某一天的价格,卖出价格 > 买入价格 + 手续费 我们就立即卖出(赚一点是一点-并不是真正的卖出)
然后如果后面又找到 更高的价格 > 上次卖出的价格 >买入价格 + 手续费,
那么我们在赚的钱的基础上再加上这次卖出的差价 prices[i] - (minPrice + fee)
然后更新minPrice为当前价格减去手续费,以便查看后面还有没有能赚的,或者找到低于这个minPrice的了,那么就结束此段交易,再次进行一轮:以minPrice买入,然后不断分析赚钱
详细代码:

class Solution
{public:int maxProfit(vector<int>& prices, int fee) {int res = 0;int minPrice = prices[0]; // 记录最低价格for (int i = 1; i < prices.size(); i++) {// 找到一个低价的,赶紧买入,结束上段交易开始新的(上段交易赚够了)if (prices[i] < minPrice) minPrice = prices[i];// 保持原有状态(此时买入不便宜,卖则亏本) 注意这个if可以省略不写if (prices[i] >= minPrice && prices[i] <= minPrice + fee) {continue;}// 计算利润,可能有多次计算利润,最后一次计算利润才是真正意义的卖出//如果今天的价格比上次记录的 买入价格+手续费 还赚if (prices[i] > minPrice + fee) {res += prices[i] - (minPrice + fee); // 就以i这天卖出 以上次minPrice买入的那个股票 会赚多少  ← 这就是上次少赚的利润minPrice = prices[i] - fee; // 更新最小值,当前卖出价格减去手续费,从而以后的交易都会自动扣除手续费}}return res;}
};

涉及知识点:

1.动态规划(dp)

leetcode-买卖股票的最佳时机含手续费相关推荐

  1. 【LeetCode】买卖股票的最佳时机含手续费 [M](动态规划)

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

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

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

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

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

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

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

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

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

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

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

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

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

  8. leetcode 714 买卖股票的最佳时机含手续费-动态规划(中等)

    714 买卖股票的最佳时机含手续费-动态规划(中等) 给定一个整数数组 prices,其中第 i 个元素代表了第 i 天的股票价格 :非负整数 fee 代表了交易股票的手续费用. 你可以无限次地完成交 ...

  9. leetcode(力扣)738. 单调递增的数字||714. 买卖股票的最佳时机含手续费

    738. 单调递增的数字 class Solution { public:int monotoneIncreasingDigits(int n) {string strNum=to_string(n) ...

  10. 【leetcode】714.买卖股票的最佳时机含手续费

    题目详见 714.买卖股票的最佳时机含手续费 题目难点 买入和卖出时机的位置怎么算 解决方案 买入点:最低价格就行 卖出点:例如1.6.8 fee=2,很明显在1买入,在8卖出,那怎么用算法来判断呢, ...

最新文章

  1. Vim 常用命令总结
  2. 天翼云从业认证【考前半小时的30句话】
  3. Object-c基础之一:#import,NSLog(),数据类型
  4. 数据库同步和数据库复制技术分析
  5. 我的世界服务器怎么修改矿物,我的世界怎么设置自定义矿物
  6. Python的迭代器
  7. Oracle和SQL server的数据类型比较
  8. java版本的在线OJ项目
  9. 【新手必看】全网最全平面设计理论基础知识,平面设计重要理论
  10. C#自学29—简体字繁体字转换
  11. fbx 模型转换 export
  12. 如何将列表转换为字符串Python?
  13. 怎么给视频换背景?只需4步,即可轻松换背景
  14. Python调用R出现“UnicodeDecodeError: ‘utf-8‘ codec can‘t decode byte 0xb2” 问题
  15. 基于注意力的语义分割之PSANet、DANet、OCNet、CCNet、EMANet、SANet等
  16. 信捷plc485通信上位机_【新阁教育】穷学上位机系列——搭建STEP7仿真环境
  17. 什么是XP (极限编程)
  18. 2018.07.17【省赛模拟】模拟B组 比赛题解(总结)
  19. IfcOpenShell简明教程【BIM】
  20. 大数据是电子地图的基础,AI成为下一个技术风口

热门文章

  1. 转:人生有三重境界:看山是山,看水是水;看山不是山,看水不是水;看山还是山,看水还是水...
  2. rstudio查询命令_RStudio终端操作
  3. 破解百度图片防爬虫机制(百度图片爬虫)
  4. 在繁杂的网页中揪出email地址
  5. c语言内联int 21h,[X64内核]SMAP,SMEP
  6. 利用开源工具搭一套汉英翻译系统(二):词对齐
  7. 直播源码开发,css预加载旋转动画 与 流光字体
  8. PyG自定义数据集学习笔记(持续更新
  9. 目标框选之单阶段与两阶段目标检测区别
  10. 目标检测透视变换数据增强包含label(yolov5格式)