消息队列之KAFKA
2026/6/10 21:05:56
下面我把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:持有 → 贡献01:卖出 → 贡献+prices[i][
profit = \sum strategy[i] \times prices[i]
]
修改规则:
k的连续子数组k/2天 → 全部改成0k/2天 → 全部改成1⚠️k是偶数
修改 0 次或 1 次,使总利润最大
baseProfit = Σ strategy[i] * prices[i]我们只需要关心:
“一次修改,最多能额外增加多少利润”
设修改区间是[l, r],长度k
其中:
[l, l + k/2 - 1]→ 改为0[l + k/2, r]→ 改为1Σ strategy[i] * prices[i]前半段:0 后半段:+prices[i]原来: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])
]
kk的区间👉O(n)
baseProfit:不修改的利润delta:当前窗口的利润增量maxDelta:所有窗口中最大的增量设当前窗口[i - k + 1, i]
ii在后半段 → 加(1 - strategy[i]) * prices[i]i - k-strategy[x] * prices[x](1 - strategy[x]) * prices[x]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) |
题目描述是业务语言
真正考的是:
很多人卡在: