news 2026/4/16 15:30:34

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/4/16 13:05:09

从零构建云原生“试验田”:超融合的自我修养

对于多数企业而言&#xff0c;云原生转型从不是“一步到位”的豪赌&#xff0c;而是通过搭建轻量化“试验田”逐步验证、迭代的过程。这个试验田既要低成本、易部署&#xff0c;又要能模拟真实生产环境的复杂负载&#xff0c;还要为后续规模化扩展预留空间。超融合凭借“计算、…

作者头像 李华
网站建设 2026/4/16 12:25:44

aiSim领衔!国内外自动驾驶仿真软件大全:热门推荐与选择指南

在自动驾驶技术飞速发展的今天&#xff0c;仿真测试已成为自动驾驶算法研发、验证的核心环节&#xff0c;能够大幅降低路测成本、突破场景复现限制&#xff0c;据行业数据显示&#xff0c;约90%的自动驾驶算法测试通过仿真平台完成。目前市面上涌现出多款功能各异的自动驾驶仿真…

作者头像 李华
网站建设 2026/4/16 14:05:43

xactengine2_2.dll文件丢失找不到怎么办?免费下载方法分享

在使用电脑系统时经常会出现丢失找不到某些文件的情况&#xff0c;由于很多常用软件都是采用 Microsoft Visual Studio 编写的&#xff0c;所以这类软件的运行需要依赖微软Visual C运行库&#xff0c;比如像 QQ、迅雷、Adobe 软件等等&#xff0c;如果没有安装VC运行库或者安装…

作者头像 李华
网站建设 2026/4/16 12:46:41

Java基于SSM+JSP的经典诗文爱好者学习交流平台

项目说明 在信息爆炸的时代&#xff0c;互联网技术的迅猛发展&#xff0c;为各类文化交流与传承提供了新的可能。经典诗文作为中华文化的瑰宝&#xff0c;其传承与发扬显得尤为重要。因此&#xff0c;构建一个专为经典诗文爱好者设计的学习交流平台&#xff0c;不仅是技术的革新…

作者头像 李华