news 2026/5/13 2:29:51

LeetCode 3652: 按策略买卖股票的最佳时机

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
LeetCode 3652: 按策略买卖股票的最佳时机

题目理解

给定价格数组prices和策略数组strategy,策略可以是:

  • -1: 买入
  • 0: 持有
  • 1: 卖出

利润 = Σ(strategy[i] × prices[i])

我们可以进行最多一次修改:选择连续 k 个元素,前 k/2 个改为 0,后 k/2 个改为 1。

求最大可能利润。

解题思路

方法一:暴力枚举(朴素思路)

最直接的想法是枚举所有可能的修改位置:

  • 不修改的情况
  • 从索引 0, 1, 2, …, n-k 开始修改

每次计算修改后的总利润,取最大值。

时间复杂度: O(n²) - 枚举 O(n) 个位置,每次重新计算总利润 O(n)

方法二:前缀和优化(推荐)

观察到暴力方法有大量重复计算。我们可以用前缀和优化。

核心思想

设原始利润为base = Σ(strategy[i] × prices[i])

当我们修改从位置 i 开始的 k 个元素时:

修改前: [i, i+1, ..., i+k/2-1, i+k/2, ..., i+k-1] 修改后: [ 全部变成0 ][ 全部变成1 ]

设:

  • p1 = i,p2 = i + k/2 - 1(前半部分,变成 0)
  • p3 = i + k/2,p4 = i + k - 1(后半部分,变成 1)

则:

  • 原利润在 [p1, p2] 区间:base1 = Σ(strategy[j] × prices[j]),修改后变为 0
  • 原利润在 [p3, p4] 区间:base2 = Σ(strategy[j] × prices[j]),修改后变为Σprices[j]

关键公式

新利润 = base - base1 - base2 + Σprices[p3~p4]

即:

profit_diff = Σprices[p3~p4] - base1 - base2

只有当profit_diff > 0时,修改才能提升利润。

前缀和预处理

使用两个前缀和数组:

  1. prefixSums[i]: prices 的前缀和,用于快速计算价格区间和
  2. baseSums[i]: strategy[j] × prices[j] 的前缀和,用于快速计算原利润

这样每次查询区间和的时间从 O(k) 降到 O(1)。

时间复杂度: O(n) - 预处理 O(n),枚举 O(n) 个位置,每次 O(1) 计算

空间复杂度: O(n)

代码实现

funcmaxProfit(prices[]int,strategy[]int,kint)int64{n:=len(prices)// 前缀和预处理prefixSums:=make([]int64,n+1)// prices 的前缀和baseSums:=make([]int64,n+1)// strategy[i]*prices[i] 的前缀和varbaseint64fori:=0;i<n;i++{prefixSums[i+1]=prefixSums[i]+int64(prices[i])base+=int64(strategy[i])*int64(prices[i])baseSums[i+1]=baseSums[i]+int64(strategy[i])*int64(prices[i])}// 边界:k > n 时无法修改ifk>n{returnbase}maxProfit:=base// 枚举所有修改起点fori:=0;i<=n-k;i++{p1:=i p2:=i+k/2-1p3:=i+k/2p4:=i+k-1// 原利润中被修改部分的贡献base1:=baseSums[p2+1]-baseSums[p1]base2:=baseSums[p4+1]-baseSums[p3]// 修改后后半部分的贡献(全为1)priceSum:=prefixSums[p4+1]-prefixSums[p3]// 新利润 = 原利润 - 被移除部分 + 新增部分profit:=base-base1-base2+priceSumifprofit>maxProfit{maxProfit=profit}}returnmaxProfit}

示例演示

prices = [4,2,8], strategy = [-1,0,1], k = 2为例:

预处理

  • base = (-1)×4 + 0×2 + 1×8 = 4
  • prefixSums = [0, 4, 6, 14]
  • baseSums = [0, -4, -4, 4]

枚举修改位置

  • i=0: 修改 [0,1] → [0,1,1]

    • base1 = baseSums[1] - baseSums[0] = -4
    • base2 = 0 (p3=p4+1)
    • priceSum = prefixSums[2] - prefixSums[1] = 2
    • profit = 4 - (-4) - 0 + 2 =10
  • i=1: 修改 [1,2] → [-1,0,1] (无变化)

    • profit = 4

最大利润: 10

复杂度分析

  • 时间复杂度: O(n),其中 n 是数组长度
  • 空间复杂度: O(n),用于存储前缀和数组

总结

本题的关键是识别暴力枚举中的重复计算,通过前缀和实现 O(1) 的区间和查询,将时间复杂度从 O(n²) 优化到 O(n)。这是一个典型的「暴力→优化」的思维过程。

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

Multisim 实现简易走廊声光双控延时照明灯电路仿真设计

multisim简易走廊声光双控延时照明灯电路仿真设计 功能&#xff1a; 1.白天有声音时&#xff0c;灯不亮。 2.黑天&#xff0c;无声音时&#xff0c;灯不亮。 3.只有在黑天且有声音时&#xff0c;灯亮起。 4.声音消失后&#xff0c;灯亮一段时间后&#xff0c;自动熄灭。 资料包…

作者头像 李华
网站建设 2026/5/12 0:04:08

我挖到Gemini 3.0 Pro十大隐藏玩法,做网页已经落后N个版本了

在 AI 圈子里&#xff0c;有一种共识正在被悄悄打破&#xff1a;大部分人还在把Gemini 3.0 Pro 当成一个“更好用的聊天框”或者“写代码助手”。如果你还在执着于让它帮你生成一段网页 HTML&#xff0c;或者写一个简单的 Python 脚本&#xff0c;那么你可能正握着一把屠龙宝刀…

作者头像 李华
网站建设 2026/5/8 12:17:04

工业元宇宙Agent渲染优化全攻略(性能提升90%实战案例)

第一章&#xff1a;工业元宇宙Agent渲染技术概述工业元宇宙正逐步成为智能制造、数字孪生与虚拟协作的核心平台&#xff0c;其中Agent作为具备感知、决策与交互能力的智能实体&#xff0c;其可视化渲染技术直接影响系统的沉浸感与实时性。为了实现高保真、低延迟的视觉呈现&…

作者头像 李华
网站建设 2026/5/10 11:04:37

为什么顶尖医院都在部署隐私计算?医疗 Agent 的未来已来

第一章&#xff1a;医疗 Agent 的隐私保护在医疗人工智能系统中&#xff0c;Agent 作为核心交互与决策单元&#xff0c;频繁处理患者健康记录、诊断数据和治疗方案等敏感信息。因此&#xff0c;确保其在整个生命周期中的隐私保护能力至关重要。隐私泄露不仅违反法律法规如《个人…

作者头像 李华
网站建设 2026/5/12 22:01:14

为什么你的Agent在元宇宙中“卡顿”?深度剖析交互逻辑底层架构

第一章&#xff1a;元宇宙 Agent 的交互逻辑在元宇宙环境中&#xff0c;Agent&#xff08;智能体&#xff09;作为用户代理或自主实体&#xff0c;其交互逻辑构成了虚拟世界动态行为的核心。Agent 不仅需要感知环境变化&#xff0c;还必须基于规则或学习模型做出响应&#xff0…

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

智能施肥Agent实战指南(从数据采集到模型部署):打造高效种植闭环系统

第一章&#xff1a;智能施肥Agent的核心价值与系统架构 智能施肥Agent作为现代农业智能化转型的关键组件&#xff0c;致力于通过数据驱动的方式优化农田养分管理。该系统融合传感器网络、作物生长模型与人工智能算法&#xff0c;实现对土壤肥力、作物需求及环境变化的动态感知与…

作者头像 李华