news 2026/6/22 11:24:36

leetCode每日一题:按策略买卖股票的最佳时机

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
leetCode每日一题:按策略买卖股票的最佳时机

下面我把LeetCode 3652:按策略买卖股票的最佳时机
完整做一遍:从建模 → 思路 → 算法 → 代码(含详细注释),一步一步来。
原题
给你两个整数数组 prices 和 strategy,其中:

prices[i] 表示第 i 天某股票的价格。 strategy[i] 表示第 i 天的交易策略,其中: -1 表示买入一单位股票。 0 表示持有股票。 1 表示卖出一单位股票。 同时给你一个 偶数 整数 k,你可以对 strategy 进行 最多一次 修改。一次修改包括: 选择 strategy 中恰好 k 个 连续 元素。 将前 k / 2 个元素设为 0(持有)。 将后 k / 2 个元素设为 1(卖出)。 利润 定义为所有天数中 strategy[i] * prices[i] 的 总和 。 返回你可以获得的 最大 可能利润。

注意: 没有预算或股票持有数量的限制,因此所有买入和卖出操作均可行,无需考虑过去的操作 做出这道题,并给出详细解释,分析,和注释

一、题意重述(用“数学 + 业务”语言)

给定:

  • prices[i]:第i天股价

  • strategy[i]:第i天策略

    • -1:买入 → 对利润贡献-prices[i]
    • 0:持有 → 贡献0
    • 1:卖出 → 贡献+prices[i]

原始利润

[
profit = \sum strategy[i] \times prices[i]
]


你可以做最多一次修改

修改规则:

  • 选一个长度为k连续子数组
  • k/2天 → 全部改成0
  • k/2天 → 全部改成1

⚠️k偶数


目标

修改 0 次或 1 次,使总利润最大


二、关键思维:问题本质是什么?

1️⃣ 原利润是固定的

baseProfit = Σ strategy[i] * prices[i]

我们只需要关心:

“一次修改,最多能额外增加多少利润”


2️⃣ 修改 = 对一段区间的“利润差值”

设修改区间是[l, r],长度k
其中:

  • [l, l + k/2 - 1]→ 改为0
  • [l + k/2, r]→ 改为1
原贡献
Σ strategy[i] * prices[i]
新贡献
前半段:0 后半段:+prices[i]
增量 = 新 - 原

三、把“增量”拆成两个部分

🔹 前半段(变成 0)

原来:strategy[i] * prices[i] 现在:0 增量:- strategy[i] * prices[i]

🔹 后半段(变成卖出)

原来:strategy[i] * prices[i] 现在:+prices[i] 增量:(1 - strategy[i]) * prices[i]

✅ 单次修改的总增量

[
\Delta =
\sum_{前半段} (-strategy[i] \cdot prices[i])
+
\sum_{后半段} ((1 - strategy[i]) \cdot prices[i])
]


四、算法思路(滑动窗口)

为什么用滑动窗口?

  • 区间长度固定为k
  • 要枚举所有连续长度为k的区间
  • 每次移动只加减一个元素

👉O(n)


核心变量

  • baseProfit:不修改的利润
  • delta:当前窗口的利润增量
  • maxDelta:所有窗口中最大的增量

滑动时怎么更新?

设当前窗口[i - k + 1, i]

新进入的元素i

  • i在后半段 → 加(1 - strategy[i]) * prices[i]

移出的元素i - k

  • 若它原来在前半段 → 减-strategy[x] * prices[x]
  • 若在后半段 → 减(1 - strategy[x]) * prices[x]

五、完整 Java 实现(带详细注释)

classSolution{publiclongmaxProfit(int[]prices,int[]strategy,intk){intn=prices.length;// 1. 计算原始利润longbaseProfit=0;for(inti=0;i<n;i++){baseProfit+=(long)strategy[i]*prices[i];}// 如果 k 为 0 或无法修改if(k==0||k>n){returnbaseProfit;}inthalf=k/2;longdelta=0;longmaxDelta=0;// 2. 初始化第一个窗口 [0, k-1]for(inti=0;i<k;i++){if(i<half){// 前半段 → 变成 0delta+=-(long)strategy[i]*prices[i];}else{// 后半段 → 变成卖出delta+=(long)(1-strategy[i])*prices[i];}}maxDelta=Math.max(0,delta);// 3. 滑动窗口for(inti=k;i<n;i++){intout=i-k;// 移除 outif(out<out+half){delta-=-(long)strategy[out]*prices[out];}else{delta-=(long)(1-strategy[out])*prices[out];}// 加入 iif(i<out+k-half){delta+=-(long)strategy[i]*prices[i];}else{delta+=(long)(1-strategy[i])*prices[i];}maxDelta=Math.max(maxDelta,delta);}// 4. 原始利润 + 最佳增量returnbaseProfit+maxDelta;}}

六、复杂度分析

项目复杂度
时间O(n)
空间O(1)

七、为什么这题是「中等」但难度偏高?

  1. 题目描述是业务语言

  2. 真正考的是:

    • 数学建模能力
    • 把“策略变化”转为“区间增量”
  3. 很多人卡在:

    • 不知道“利润增量”怎么计算
    • 想 DP,其实不需要

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/17 14:39:14

vue3 新建文件store自动导入

store下新增个index.js用来做自动导入&#xff08;pinia使用可参考之前这篇文章 //使用pinia来管理全局状态 import { createPinia } from pinia // 自动导入所有 store 文件 const modulesFiles import.meta.glob(./modules/*.js, { eager: true }) const stores {}for (co…

作者头像 李华
网站建设 2026/6/19 2:02:22

资金管理平台的核心业务场景中,凡是涉及资金权属变动、资金形态转换、资金成本 / 收益确认的操作,都会触发会计核算需求。这些场景的核算结果需同步至财务系统(如 SAP FI 模块),确保资金流与账务流的

资金管理平台的核心业务场景中&#xff0c;凡是涉及资金权属变动、资金形态转换、资金成本 / 收益确认的操作&#xff0c;都会触发会计核算需求。这些场景的核算结果需同步至财务系统&#xff08;如 SAP FI 模块&#xff09;&#xff0c;确保资金流与账务流的一致性。结合软件外…

作者头像 李华
网站建设 2026/6/16 3:22:47

5.5 信息论在机器学习中的应用:正则化、特征选择与模型比较

5.5 信息论在机器学习中的应用:正则化、特征选择与模型比较 信息论不仅为理解和量化信息提供了坚实的数学基础,其核心概念——熵、互信息和Kullback-Leibler散度——更在机器学习的算法设计、理论分析和实际应用中扮演着至关重要的角色。这些概念超越了其通信理论的起源,成…

作者头像 李华
网站建设 2026/6/22 3:57:12

一文搞懂 Function Calling、MCP、A2A 和 Skills

之前我们已经单独介绍了MCP、Fuction Calling、A2A乃至&#xff08;Claude&#xff09;Skills。 但是很多粉丝依旧觉得有些懵逼&#xff0c;我想了想原因&#xff0c;大概是单点知识不具备连贯性&#xff0c;要把他们完全搞懂&#xff0c;可能还是要从全局出发、从目的出发。 追…

作者头像 李华
网站建设 2026/6/15 12:41:43

如果同一份输入,多次执行结果不同,它就不该被称为“决策系统”

在当前大量 AI 系统被引入“决策场景”的背景下&#xff0c;我想先抛出一个看似基础、但长期被忽略的问题&#xff1a; 如果同一份输入数据&#xff0c;在不同时间、不同会话中多次执行&#xff0c;得到的决策结果不一致&#xff0c;这样的系统是否真的具备“决策能力”&#x…

作者头像 李华
网站建设 2026/6/16 20:09:37

关于工程实践的面试问题

文章目录1. 为什么要设计新的数据库Schema&#xff1f;2. 怎么保证新的Schema不污染老的&#xff0c;及项目上线注意事项&#xff1f;&#xff08;1&#xff09;避免新Schema污染老Schema的核心原则&#xff1a;**隔离性 兼容性**&#xff08;2&#xff09;上线注意事项&#…

作者头像 李华