news 2026/4/5 17:03:33

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/1 15:34:54

算法题:字符串转换成整数。

字符串转换成整数:从原理到实战的深度解析 关键词 字符串转换、整数转换、类型转换、算法设计、边界处理、异常处理、Python实现 摘要 本文将深入探讨"字符串转换成整数"这一经典算法问题,从问题背景、核心概念、算法原理到实际应用进行全方位解析。我们将详细…

作者头像 李华
网站建设 2026/4/3 6:31:17

勾股定理简单学习

前言 若a和b是直角三角形的两条直角边&#xff0c;c是斜边&#xff0c;那么 a2b2c2a^{2}b^{2}c^{2}a2b2c2 勾股定理的图解法证明 勾股定理指出&#xff0c;在直角三角形中&#xff0c;斜边的平方等于两直角边的平方和&#xff0c;即 ( a2b2c2a^2 b^2 c^2a2b2c2)。以下是几种经…

作者头像 李华
网站建设 2026/3/27 7:59:58

从零开始安装并配置开源AI编程神器OpenCode

对于个人开发者而言&#xff0c;选择 OpenCode 国产开源编程模型 的组合&#xff0c;本质上是用开源工具 国产高性价比模型复刻了甚至超越了硅谷顶尖付费产品的AI编程体验。 让我们开始安装并使用开源AI编程神器OpenCode吧&#xff01; 一&#xff0c;第一步&#xff1a;环境…

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

充电即服务:智慧园区打造“人-车-桩”智能互联新体验

1、概述 园区停车场有电动汽车和电动自行车&#xff0c;均需要提供充电桩。充电桩管理系统通过物联网技术对接入系统的充电桩站点和各个充电桩进行不间断地数据采集和监控&#xff0c;解决园区充电桩使用、监控问题。电动自行车充电可采用投币、扫码充电方式&#xff0c;电动汽…

作者头像 李华
网站建设 2026/4/1 0:28:33

基于springBoot的动漫分享系统的设计与实现

背景与意义随着互联网技术的快速发展&#xff0c;动漫文化在全球范围内的影响力不断扩大。动漫爱好者群体日益壮大&#xff0c;对动漫资源的分享、讨论和收藏需求显著增加。传统的动漫分享方式如论坛、贴吧等存在信息分散、互动性不足、资源管理混乱等问题。基于SpringBoot的动…

作者头像 李华
网站建设 2026/4/4 20:48:17

全球生成式人工智能的安全合规前瞻

随着生成式人工智能&#xff08;GenAI&#xff09;技术的迅猛发展&#xff0c;其应用范围日益广泛&#xff0c;影响力逐渐增强。然而&#xff0c;技术的双刃剑效应也引发了各国对安全与合规的深度思考。美国、欧盟和韩国作为全球科技前沿的代表&#xff0c;纷纷出台了针对性的法…

作者头像 李华