恒美微站 Logo 恒美微站
  • 首页
  • 关于我们
  • 建站服务
  • 主题模板
  • 案例展示
  • 资讯中心
  • 联系我们

动态规划专练:力扣第123、188题

  • 首页
  • 资讯中心
  • /
  • 动态规划专练:力扣第123、188题

相关资讯

OpenHarmony HUKS集成实战:从原理到CTS认证的Hi3861设备密钥管理指南 2026/8/12 17:56:14
Stable Diffusion生成结果不一致?深度解析AI绘画随机性控制与复现方法 2026/8/12 17:56:14
揭秘网络宣传网站建设建站的底层逻辑与实战避坑指南,让流量不再是玄学 2026/8/12 17:56:14

最新资讯

照片元数据管理太麻烦?试试这款免费开源工具ExifToolGui
[校大]27届华南理工大学JAVA简历:大厂简历通过率20%
ARM嵌入式开发:arm-linux-gnueabihf工具链选型、安装与实战指南
08-什么是 rebase
负二项回归分析结果解读:过度离散计数数据建模
YOLO工业质检与产品展示灯泡目标检测数据集-509张

今日推荐

终极Navicat重置指南:3种专业方案实现Mac版无限试用
终极免费围棋AI训练指南:如何用KaTrain快速提升你的棋艺水平
3分钟掌握res-downloader:全网视频音频图片资源一键下载终极指南

本周热门

5分钟告别提取码焦虑:baidupankey如何智能破解百度网盘资源锁
如何快速生成中国车牌图片:Python开源工具完整指南
当 LLM 遇见大文档:主流开源项目如何处理上下文超限

本月精选

如何用DamaiHelper实现演唱会门票的智能自动化抢购:完整技术解决方案指南
第4篇:59 倍性能差距的索引瓶颈定位——一次教科书级的全表扫描调优
终极歌词批量下载神器:5分钟解决离线音乐库歌词同步难题

动态规划专练:力扣第123、188题

发布时间:2026/8/12 18:01:14
动态规划专练:力扣第123、188题 力扣第123题-买卖股票的最佳时机Ⅲ1.本题的难点在于如何处理“2次买卖”还是可以将当天的状态分为4种1第一次持有股票。要么是之前已经买入要么是之前没有而当天买入递推公式为dp[1][0] fmax(dp[0][0], -prices[i])。2第一次未持有股票。要么是之前就已经卖出要么是之前持有今天卖出递推公式为dp[1][1] fmax(dp[0][1], dp[0][0] prices[i])。3第二次持有股票。从第二次开始的状态就需要建立在“完成了第一次买卖”之上来考虑要么是第一次卖出后在今天以前已经买入要么是之前没有而当天买入递推公式为dp[1][2] fmax(dp[0][2], dp[0][1] - prices[i])。4第二次未持有股票。要么是之前就已经卖出第二次的股票要么是之前持有今天卖出递推公式为dp[1][3] fmax(dp[0][3], dp[0][2] prices[i])。2.基于以上思想可写出完整代码如下1. int maxProfit(int* prices, int pricesSize) { 2. // dp[0][0]当前持有第1支股票 3. // dp[0][1]卖出第1支股票完成1笔交易 4. // dp[0][2]当前持有第2支股票 5. // dp[0][3]卖出第2支股票完成2笔交易 6. int dp[2][4]; 7. // 初始化第0天四种状态 8. dp[0][0] -prices[0]; // 第一天买入第一支 9. dp[0][1] 0; // 不可能卖出收益0 10. dp[0][2] -prices[0];// 当天买入再卖出再买入第二支等价直接买 11. dp[0][3] 0; // 不可能完成两次卖出 12. 13. for (int i 1; i pricesSize; i){ 14. // 状态0第一次持有要么之前就持有要么今天刚买入 15. dp[1][0] fmax(dp[0][0], -prices[i]); 16. // 状态1第一次卖出要么之前已卖出要么今天卖出第一次持仓 17. dp[1][1] fmax(dp[0][1], dp[0][0] prices[i]); 18. // 状态2第二次持有要么之前持有第二支要么第一次卖出后今天买入 19. dp[1][2] fmax(dp[0][2], dp[0][1] - prices[i]); 20. // 状态3第二次卖出要么之前完成两笔要么今天卖出第二次持仓 21. dp[1][3] fmax(dp[0][3], dp[0][2] prices[i]); 22. 23. // 更新前一天状态为当前天滚动数组压缩空间 24. dp[0][0] dp[1][0]; 25. dp[0][1] dp[1][1]; 26. dp[0][2] dp[1][2]; 27. dp[0][3] dp[1][3]; 28. } 29. 30. // 最多两次交易最大收益一定是完成两次卖出的状态 31. return dp[0][3]; 32. }该算法时间复杂度为O(n)空间复杂度为O(1)。力扣第188题-买卖股票的最佳时机Ⅳ1.本题相比于力扣第123题-买卖股票的最佳时机Ⅲ区别仅在于将允许买卖的次数从2次变为了k次本质还是没有变只需要设置2k个状态来记录第k次持有/未持有时的最大金额。递推公式也都是从上一个状态中得到的。完整代码如下1. int maxProfit(int k, int* prices, int pricesSize) { 2. // dp[0][j*2]持有第j1次买入的股票 3. // dp[0][j*21]完成第j1次完整交易已卖出 4. // 滚动数组dp[2][2k]只保存前一天和当天状态 5. int dp[2][k * 2]; 6. // 第0天初始化所有交易状态 7. for (int i 0; i k; i){ 8. dp[0][i * 2] -prices[0]; // 当天买入第i1笔 9. dp[0][i * 2 1] 0; // 无法卖出收益为0 10. } 11. 12. // 从第2天开始遍历价格数组 13. for (int i 1; i pricesSize; i){ 14. // 遍历k次交易的两种状态 15. for (int j 0; j k; j){ 16. if (j 0) { 17. // 第一次持仓之前持有 或 今日首次买入 18. dp[1][0] fmax(dp[0][0], -prices[i]); 19. } else { 20. // 非首次持仓之前持有该笔 或 上一笔卖出后今日买入 21. dp[1][j * 2] fmax(dp[0][j * 2], dp[0][j * 2 - 1] - prices[i]); 22. } 23. // 第j1次卖出之前已完成该笔交易 或 今日卖出当前持仓 24. dp[1][j * 2 1] fmax(dp[0][j * 2 1], dp[0][j * 2] prices[i]); 25. 26. // 滚动更新前一天状态为当天状态 27. dp[0][j * 2] dp[1][j * 2]; 28. dp[0][j * 2 1] dp[1][j * 2 1]; 29. } 30. } 31. 32. // 最大收益为最多k次交易全部卖出的状态 33. return dp[0][k * 2 - 1]; 34. }该算法时间复杂度为O(n * k)空间复杂度为O(k)。

关于恒美微站

恒美微站专注于为个体商户、工作室提供极简自助建站服务,让每个人都能轻松拥有专业网站。

快速链接

  • 关于我们
  • 建站服务
  • 主题模板
  • 案例展示
  • 资讯中心

服务项目

  • 可视化建站
  • 拖拽编辑
  • 主题定制
  • SEO 优化
  • 网站托管

联系方式

  • 📍 地址:北京市朝阳区建国路 88 号
  • 📞 电话:400-888-8888
  • ✉️ 邮箱:info@hmyw.cn
  • 🕐 时间:周一至周日 9:00-18:00

© 2024 恒美微站 hmyw.cn 版权所有 | 京 ICP 备 12345678 号