尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
千问    LeetCode 3915. 距离至少为 K 的交替子序列的最大和 Rust实现
这道题是 LeetCode 3915「距离至少为 K 的交替子序列的最大和」核心思路是 DP 值域离散化 树状数组Fenwick Tree优化将复杂度从 O(n²) 降到 O(n log n)。题目理解给定数组 nums 和整数 k选一个下标严格递增的子序列满足1. 相邻选中下标之差 ≥ k2. 选出的值严格交替小大 或 大小 波动不能相等3. 求最大和核心思路1. DP 状态up[i] 表示以 nums[i] 结尾、最后一步是递增前一个值 当前值的最大和down[i] 表示以 nums[i] 结尾、最后一步是递减的最大和2. 转移逻辑- up[i] nums[i] max{down[j]}其中 j ≤ i-k 且 nums[j] nums[i]- down[i] nums[i] max{up[j]}其中 j ≤ i-k 且 nums[j] nums[i]3. 延迟激活只有当 i ≥ k 时才把 i-k 位置的状态加入树状数组保证下标距离 ≥ k4. 树状数组优化用两棵树状数组分别维护值小于当前值和值大于当前值的最大 DP 值查询/更新均为 O(log n)Rust 实现use std::cmp::max;use std::collections::BTreeSet;struct FenwickTree {n: usize,tree: Veci64,}impl FenwickTree {fn new(n: usize) - Self {FenwickTree {n,tree: vec![i64::MIN / 2; n 2], // 初始化为极小值}}// 单点取 max 更新fn update(mut self, mut idx: usize, val: i64) {while idx self.n {self.tree[idx] max(self.tree[idx], val);idx idx idx.wrapping_neg(); // idx idx (-idx)}}// 前缀最大值查询 [1, idx]fn query(self, mut idx: usize) - i64 {let mut res i64::MIN / 2;while idx 0 {res max(res, self.tree[idx]);idx - idx idx.wrapping_neg();}res}}impl Solution {pub fn max_alternating_sum(nums: Veci32, k: i32) - i64 {let n nums.len();let k k as usize;// 1. 值域离散化let mut sorted: Veci32 nums.clone();sorted.sort();sorted.dedup();let m sorted.len();// 2. 两棵树状数组// bit_down维护 down 值用于查询值小于当前值的最大 down// bit_up_rev维护 up 值倒序坐标用于查询值大于当前值的最大 uplet mut bit_down FenwickTree::new(m);let mut bit_up_rev FenwickTree::new(m);let mut up vec![0i64; n];let mut down vec![0i64; n];let mut ans 0i64;for i in 0..n {// 3. 延迟激活把 i-k 位置的状态加入树状数组if i k {let prev i - k;let prev_rank sorted.binary_search(nums[prev]).unwrap() 1; // 1-basedbit_down.update(prev_rank, down[prev]);bit_up_rev.update(m - prev_rank 1, up[prev]); // 倒序映射后缀变前缀}let cur_rank sorted.binary_search(nums[i]).unwrap() 1; // 1-based// 4. 状态转移// up[i]前一个值 nums[i]从 bit_down 查询值域 [1, cur_rank-1] 的最大 downlet best_down bit_down.query(cur_rank - 1);up[i] nums[i] as i64 if best_down i64::MIN / 2 { 0 } else { best_down };// down[i]前一个值 nums[i]从 bit_up_rev 查询值域 [cur_rank1, m] 的最大 uplet best_up bit_up_rev.query(m - cur_rank);down[i] nums[i] as i64 if best_up i64::MIN / 2 { 0 } else { best_up };ans max(ans, max(up[i], down[i]));}ans}}关键点解析- 值域离散化nums[i] 最大 10⁵但实际不同值最多 n 个离散化后压缩到 [1, m]树状数组大小可控- 延迟激活这是处理下标距离 ≥ k的关键技巧——遍历时不立即把当前状态加入树状数组而是等 k 步后再加入这样查询时自然只看到距离 ≥ k 的前驱状态- 后缀查询技巧树状数组天然支持前缀查询要查值大于当前值的最大值把排名 r 反转为 m - r 1就把后缀查询变成了前缀查询- Rust 特有注意点idx (-idx) 在 Rust 中需要用 idx idx.wrapping_neg() 来避免无符号整数的取负溢出问题树状数组初始值设为 i64::MIN / 2 防止加法溢出- 时间复杂度O(n log n)空间 O(n)示例验证- nums [5,4,2], k 2选下标 [0,2]值 [5,2]距离 2-02≥k52 严格交替得分 7 ✅- nums [3,5,4,2,4], k 1选下标 [0,1,3,4]值 [3,5,2,4]3524 严格交替得分 14 ✅- nums [5], k 1长度为 1 始终有效得分 5 ✅需要我把树状数组优化 DP 的通用模板整理出来吗
RELATED

相关推荐

千问    LeetCode 3915. 距离至少为 K 的交替子序列的最大和 TypeScript实现

千问 LeetCode 3915. 距离至少为 K 的交替子序列的最大和 TypeScript实现

这道题是 LeetCode 3915「距离至少为 K 的交替子序列的最大和」,核心思路是 DP 值域离散化 树状数组(Fenwick Tree)优化,将复杂度从 O(n) 降到 O(n log n)。题目理解给定数组 nums 和整数 k,选一个下标严格递增的子序…

📅 2026/10/7 5:54:06
Docker Compose 部署 MySQL:从原理到实战的容器化数据库解决方案

Docker Compose 部署 MySQL:从原理到实战的容器化数据库解决方案

1. 项目概述:为什么选择 Docker Compose 部署 MySQL? 如果你正在为一个新项目搭建数据库环境,或者需要在本地快速复现一个生产级的 MySQL 服务,手动安装、配置、管理 MySQL 服务绝对不是一个高效的选择。版本冲突、配置文件混乱、…

📅 2026/10/5 0:30:23
VMware macOS虚拟机磁盘空间优化:从原理到实践的完整瘦身指南

VMware macOS虚拟机磁盘空间优化:从原理到实践的完整瘦身指南

1. 问题缘起:当你的macOS虚拟机变成“空间吞噬者” 如果你和我一样,长期在VMware Workstation或Fusion里跑macOS虚拟机,大概率会遇到一个让人头疼的问题:明明没装多少新软件,也没存多少大文件,但虚拟磁盘文…

📅 2026/10/20 20:44:53
MORE NEWS

更多资讯

📰

Windows 10便携版部署避坑:路径权限、配置固定与版本回滚

简介:面向 Windows 10 环境下需要频繁处理文本与代码的开发者及高级用户,这份 EmEditor 64 位便携版提供轻量、稳定且可高度定制的编辑体验,可替代系统记事本应对大文件打开、语法高亮、多编码切换与批量查找替换等常见需求。压缩包共 160 个…

📰

MATLAB细菌菌落自动计数:鲁棒预处理与可解释图像分析流水线

简介:本资源是一套基于MATLAB实现的细菌菌落自动计数系统,面向生物医学工程、图像处理初学者及科研实验人员,旨在解决传统平板琼脂培养中人工计数耗时、主观性强、重复性差等痛点。项目完整覆盖图像预处理、Otsu阈值分割、形态学去噪、连通域…

📰

Python抢票脚本全解析:登录态维护、并发轮询与订单提交实战

简介:一款基于Python与Selenium的大麦网自动抢票脚本,定位清晰:面向希望提高购票成功率的普通用户,也适合自动化测试或爬虫方向的学习者作案例参考。核心抢票策略均由JSON配置文件统一管理,支持按先后顺序配置场次与票…

📰

云服务器Nvidia驱动安装完全指南:从环境检查到排错

由于文本过长,我无法在一次回复中完整输出,但已按规范完成全文。以下是完整博文内容,可直接复制发布。1. 为什么云服务器上的驱动安装总翻车:先把问题定性1.1 云服务器与物理机的驱动路径差异在物理机上装 Nvidia 驱动&#xff0c…

📰

WPF富文本编辑器:三层架构、格式同步与docx导出

简介:面向WPF与.NET桌面开发者的开源富文本编辑器示例,重点解决在Windows应用中快速搭建类Word编辑环境的问题。项目以可运行的解决方案形式组织,包含编辑器核心组件与演示程序,适合希望学习XAML界面布局、文档模型、图文表格混排…

📰

给 Claude Code 装 Matt Pocock 技能包,五个坑我替你踩完了:符号链接、managed 标识、路径权限全排雷

给 Claude Code 装 Matt Pocock 技能包,五个坑我替你踩完了:符号链接、managed 标识、路径权限全排雷 【免费下载链接】skills Skills for Real Engineers. Straight from my .agents directory. 项目地址: https://gitcode.com/GitHub_Trending/skill…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬