news 2026/10/5 15:03:21

day163—递归—买卖股票的最佳时机含冷冻期(LeetCode-309)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
day163—递归—买卖股票的最佳时机含冷冻期(LeetCode-309)

题目描述

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

设计一个算法计算出最大利润。在满足以下约束条件下,你可以尽可能地完成更多的交易(多次买卖一支股票):

  • 卖出股票后,你无法在第二天买入股票 (即冷冻期为 1 天)。

注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。

示例 1:

输入:prices = [1,2,3,0,2]输出:3解释:对应的交易状态为: [买入, 卖出, 冷冻期, 买入, 卖出]

示例 2:

输入:prices = [1]输出:0

提示:

  • 1 <= prices.length <= 5000
  • 0 <= prices[i] <= 1000

解决方案:

这段代码是基于记忆化递归求解 “含冷冻期的股票买卖最佳时机” 问题(买入股票后需隔至少一天才能再次操作,即卖出后次日不能买入),在原有无限次交易递归逻辑的基础上,仅修改了 “买入” 操作的前驱状态,适配了冷冻期规则,同时保留记忆化优化以解决超时 / 栈溢出问题。

核心逻辑

  1. 核心定义:

    • memo:二维记忆化数组(len×2),memo[end][0/1]缓存dfs(end, is)的结果(0 = 不持有股票,1 = 持有股票),避免重复递归;
    • dfs(end, is, nums):返回从第 0 到第end天,在is状态(true= 持有、false= 不持有)下能获得的最大利润,且满足 “冷冻期” 规则。
  2. 递归边界:

    • 当end < 0(所有天数遍历完毕):
      • 若is=true(仍持有股票),返回-0xFFFF(极小值,代表非法状态);
      • 若is=false(不持有股票),返回 0(无交易时利润为 0)。
  3. 记忆化优化:计算dfs(end, is)前,先检查memo[end][state](state为 0/1 对应不持有 / 持有),若不为 - 1 则直接返回缓存值,避免重复递归,时间复杂度从O(2n)降至O(n)。

  4. 状态转移(核心:适配冷冻期):

    • 持有股票(is=true):代表第end天买入了股票,因冷冻期规则,买入前必须保证第end-1天不操作(即前驱状态为end-2天不持有),因此利润取:
      • 继续持有:dfs(end-1, true, nums)(第end天不操作,保持持有);
      • 买入股票:dfs(end-2, false, nums) - nums[end](第end天买入,成本为nums[end],且前驱是end-2天不持有,规避冷冻期);
      • 最终取两者最大值。
    • 不持有股票(is=false):代表第end天卖出或不操作,无冷冻期限制,利润取:
      • 继续不持有:dfs(end-1, false, nums)(第end天不操作);
      • 卖出股票:dfs(end-1, true, nums) + nums[end](第end天卖出,收益为nums[end]);
      • 最终取两者最大值。
  5. 主函数逻辑:初始化记忆化数组,调用dfs(len-1, false, prices)(从最后一天、不持有股票的初始状态开始计算),返回符合冷冻期规则的最大利润。

关键特点

  • 规则适配:仅修改 “买入” 操作的前驱状态为end-2,精准适配 “卖出后次日不能买入” 的冷冻期规则;
  • 效率优化:记忆化缓存解决了纯递归的超时 / 栈溢出问题,能处理大数据量用例;
  • 逻辑兼容:保留原有递归框架,仅最小化修改核心状态转移,易理解、易维护。

总结

  1. 核心思路:在记忆化递归的基础上,通过调整 “买入” 操作的前驱状态(从end-1改为end-2),适配股票买卖的冷冻期规则;
  2. 关键设计:memo数组缓存状态结果是效率核心,end-2的前驱状态是冷冻期规则的核心体现;
  3. 功能效果:能正确计算含冷冻期的股票最大利润,稳定通过大数据量用例。

函数源码:

class Solution { public: vector<vector<int>> memo; // 仅修改该函数:增加记忆化+修正状态转移符号+规范边界值 int dfs(int end, bool is, vector<int>& nums) { int len = nums.size(); if(end < 0) { // 边界值修正:用INT_MIN表示持有股票的非法状态,更规范 if(is) return -0xFFFF; return 0; } int state = is ? 1 : 0; // 0=不持有,1=持有 if (memo[end][state] != -1) { return memo[end][state]; } int res; if(is) { res = max(dfs(end-1, true, nums), dfs(end-2, false, nums) - nums[end]); } else { res = max(dfs(end-1, false, nums), dfs(end-1, true, nums) + nums[end]); } // 缓存当前状态的结果 return memo[end][state] = res; } int maxProfit(vector<int>& prices) { int len = prices.size(); if (len == 0) return 0; // 空数组边界处理 // 初始化记忆化数组(len行2列,初始值-1表示未计算) memo.assign(len, vector<int>(2, -1)); // max(0, ...) 确保利润不会为负(无交易时利润为0) return dfs(len-1, false, prices); } };
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/4 6:26:14

边界之内:为何高维内插无法催生下一次科学革命?

在一个被大数据和人工智能的承诺所笼罩的时代&#xff0c;一种信念日益深入人心&#xff1a;只要有足够的数据和强大的算法&#xff0c;我们就能自动解锁自然界最深邃的奥秘。机器学习模型在蛋白质折叠、材料发现和气候预测等领域取得的惊人成就&#xff0c;似乎都在为这一愿景…

作者头像 李华
网站建设 2026/10/5 7:46:03

Spring Boot 三种方式登录系统:集成微信扫码、短信验证码、邮箱验证码

Spring Boot 三种方式登录系统&#xff1a;集成微信扫码、短信验证码、邮箱验证码&#xff08;含高并发与安全增强&#xff09; 主要因为前面的帖子不太完整。 一、引言 在现代 Web 应用中&#xff0c;提供多种灵活、安全的登录方式已成为标配。本文档旨在提供一套生产就绪的…

作者头像 李华
网站建设 2026/10/3 16:58:35

HTML5 与 H5:别再让你的专业度在称呼中流失

在中国互联网行业的日常交流中&#xff0c;很少有一个词像“H5”这样被高频使用&#xff0c;却又被如此普遍地误解。当你听到有人说“做一个 H5”时&#xff0c;对方指的往往是一个在微信朋友圈传播的精美幻灯片&#xff0c;或者是一个简单的营销小游戏。然而&#xff0c;当你打…

作者头像 李华
网站建设 2026/10/4 6:26:14

3-VueAjax

什么是Vue Vue是一款用于构建用户界面的渐进式的JavaScript框架。官方网站&#xff1a;https://cn.vuejs.org/ 前端负责将数据以美观的样式呈现出来&#xff0c;而数据最终又要在数据库服务器中存储并管理。前端想要拿到数据&#xff0c;就需要请求服务器。然后服务器将数据返…

作者头像 李华
网站建设 2026/10/4 6:25:54

基于springBoot的房屋租赁管理系统

房屋租赁管理系统的背景意义 市场需求驱动 随着城市化进程加快&#xff0c;流动人口增多&#xff0c;房屋租赁需求持续增长。传统租赁方式依赖中介或线下沟通&#xff0c;效率低且信息不透明。数字化管理系统能优化流程&#xff0c;提升供需匹配效率&#xff0c;降低交易成本…

作者头像 李华
网站建设 2026/10/5 6:34:09

Java基于SSM+JSP的智慧农业无人机租赁系统的设计与实现

项目说明 农业无人机是一种在现代农业中广泛应用的无人机设备&#xff0c;它可以通过遥控或自主飞行&#xff0c;进行一系列农业作业。这些无人机通常配备有高分辨率相机和绘图设备&#xff0c;可以用于进行土地勘测、作物评估、农药喷洒等农业活动。无人机在农业领域的应用&am…

作者头像 李华