当前位置: 首页 > news >正文

LeetCode 188. 买卖股票的最佳时机 IV(C语言详解 + 通用模板)

一、题目描述

给定一个整数数组prices和一个整数k,其中prices[i]表示第i天的股票价格。

你最多可以完成k笔交易(每次交易包含一次买入和一次卖出),求最大利润。

注意:不能同时进行多笔交易(必须先卖出再买入)。


二、核心思路(动态规划)

这题是股票系列中最通用的一题(终极版)


1️⃣ 关键优化(必须想到)

当:

k >= pricesSize / 2

👉 问题等价于:不限次数交易(LeetCode 122)

因为最多只能进行n/2次完整交易。


2️⃣ 状态定义

我们定义两个数组:

  • buy[j]:第 j 次买入后的最大利润

  • sell[j]:第 j 次卖出后的最大利润


3️⃣ 状态转移

每天遍历价格price

buy[j] = max(buy[j], sell[j-1] - price); sell[j] = max(sell[j], buy[j] + price);

4️⃣ 初始化

buy[j] = INT_MIN; sell[j] = 0;

三、完整 C 代码

#include <limits.h> int maxProfit(int k, int* prices, int pricesSize) { if (pricesSize == 0 || k == 0) return 0; // 情况1:等价于无限次交易 if (k >= pricesSize / 2) { int res = 0; for (int i = 1; i < pricesSize; i++) { if (prices[i] > prices[i - 1]) { res += prices[i] - prices[i - 1]; } } return res; } int buy[k + 1]; int sell[k + 1]; for (int j = 0; j <= k; j++) { buy[j] = INT_MIN; sell[j] = 0; } for (int i = 0; i < pricesSize; i++) { for (int j = 1; j <= k; j++) { if (buy[j] < sell[j - 1] - prices[i]) { buy[j] = sell[j - 1] - prices[i]; } if (sell[j] < buy[j] + prices[i]) { sell[j] = buy[j] + prices[i]; } } } return sell[k]; }

四、举例分析

示例:

k = 2 prices = [3,2,6,5,0,3]

过程:

  1. 第2天买入(2),第3天卖出(6)→ 利润 4

  2. 第5天买入(0),第6天卖出(3)→ 利润 3

总利润 =7


五、核心理解(非常关键)

整个过程可以看成:

buy[1] → 第一次买 sell[1] → 第一次卖 buy[2] → 第二次买 sell[2] → 第二次卖 ...

状态链:

sell[0] = 0 ↓ buy[1] ↓ sell[1] ↓ buy[2] ↓ sell[2] ...

👉 本质就是“多阶段状态机”。


六、和其他股票问题的关系(重点总结)

题号限制解法
1211 次交易记录最小值
122无限次贪心
1232 次交易固定 2 组 buy/sell
188k 次交易通用 DP(本题)

👉 可以统一为一套模板!


七、复杂度分析

  • 时间复杂度:O(n * k)

  • 空间复杂度:O(k)


八、总结(面试重点)

这题最重要的三点:

  1. 想到 k ≥ n/2 → 贪心优化

  2. 理解 buy/sell 状态机

  3. 掌握通用模板(可解决所有股票问题)


九、一句话总结

👉 股票问题本质:
“第 j 次买/卖的最优状态转移”

http://www.jsqmd.com/news/516755/

相关文章:

  • 分布式限流实战 | 从算法原理到Redisson滑动窗口实现
  • 罗勒植物生长周期生长状态检测数据集VOC+YOLO格式1174张3类别
  • 保姆级教程:在Jetson Orin NX上,用Ubuntu 22.04和Livox MID360跑通FAST-LIO(避坑指南)
  • 智能酒厂浓度计哪个品牌好用,江苏迅创科技靠谱吗? - mypinpai
  • 手把手教你解决BottomSheetDialogFragment嵌套ScrollView时的奇怪关闭问题
  • 超自然行动组客服咨询AI流量赋能,重塑智能体验新标杆 - 速递信息
  • AIVideo与Matlab集成:科研视频数据处理与分析
  • MySQL数据优化+操作系统的生命周期的庖丁解牛
  • Node.js后端服务集成:调用InternLM2-Chat-1.8B API构建智能聊天接口
  • 2026瞬态吸收光谱仪采购指南:优质生产商、品牌排名与选购技巧 - 品牌推荐大师1
  • Surface Pro 7三年使用报告:从生产力工具到远程连接器的真实体验
  • Spring Authorization Server登出避坑指南:JWT Token撤销无效、前后端分离Session问题怎么破?
  • 嵌入式CAN消息队列:轻量无锁SPSC环形缓冲设计
  • 基于yolo11 yolo26算法的水果新鲜度识别 水果腐烂识别数据集 蔬菜新鲜度检测 水果识别 蔬菜识别 yolo数据集第10590期
  • Qwen3助力在线教育:计算机网络课程视频自动字幕生成案例
  • Ubuntu系统下如何彻底清理/dev/loop占用空间(附详细步骤)
  • 如果使用 LIKE ‘ %abc‘ (百分号开头),索引失效,ICP 也无用。
  • 人脸识别OOD模型快速上手:Postman调用API获取特征+质量分+置信区间
  • 聊聊2026年盐城靠谱的PTFE滤袋源头厂家,推荐防水PTFE滤袋源头厂家 - 工业设备
  • 告别MyBatis!用Hutool的Entity玩转数据库CRUD(含事务实战案例)
  • kawaii-mqtt软件包深度调优指南:如何给内存分配打标记快速定位泄漏点
  • 从零到一:在Ubuntu 20.04上配置NS-3.36与CLion集成开发环境
  • Z-Image-Turbo_Sugar脸部Lora与Unity引擎联动:为游戏角色快速生成多样化肖像素材
  • OpenClaw+ollama-QwQ-32B:3种常见自动化任务实战演示
  • Ubuntu24.04下Docker镜像源更换全攻略:从临时到永久,附最新可用源清单
  • TEC控温算法实战:如何用PID实现±0.1℃高精度恒温(附代码解析)
  • 探讨盐城靠谱的PTFE除尘滤袋厂家排名,前十名有谁? - 工业品网
  • Linux服务器上离线部署RAGFlow全流程(含Docker避坑指南)
  • Janus-Pro-7B实测指南:不同分辨率图片输入对理解效果的影响分析
  • 利用 KeyStore Explorer 快速生成带 SAN 的 HTTPS 证书并集成到 SpringBoot 项目