DeepSeek LeetCode LCP 24. 数字游戏 Rust实现

发布时间:2026/10/24 3:43:12

DeepSeek    LeetCode LCP 24. 数字游戏 Rust实现 这道题的核心在于数学转化 动态维护中位数。下面是解题思路与完整的 Rust 实现。核心解题思路1. 问题转化最终需要满足 nums[a1] nums[a] 1。对于前 i 个元素等价于将 nums[t] - t 变为同一个数 x。例如 nums[1] 要变成 x1等价于把 nums[1]-1 变成 x。2. 最小代价将一串数变成同一个数 x 的最小总操作数是当 x 取这串数的中位数时取得的。因此问题转化为对每个前缀 [0..i]求数组 b[t] nums[t] - t 的中位数并计算所有 b[t] 到中位数的距离之和。3. 动态维护中位数对顶堆使用两个堆来动态维护中位数· 大根堆 (lower)保存较小的一半元素堆顶是这部分的最大值。· 小根堆 (upper)保存较大的一半元素堆顶是这部分的最小值。· 维护 lower 的大小等于 upper 的大小或比它多 1。这样 lower 的堆顶就是当前数据流的中位数。· 同时维护 lower_sum 和 upper_sum 来快速计算距离和。Rust 实现rustuse std::collections::BinaryHeap;use std::cmp::Reverse;impl Solution {pub fn nums_game(nums: Veci32) - Veci32 {const MOD: i64 1_000_000_007;let n nums.len();let mut ans Vec::with_capacity(n);// 大根堆存较小的一半使用 Reverse 实现最大堆let mut lower BinaryHeap::new();// 小根堆存较大的一半let mut upper BinaryHeap::new();let mut lower_sum: i64 0;let mut upper_sum: i64 0;for (i, num) in nums.iter().enumerate() {// 关键转化nums[i] - ilet x (num - i as i32) as i64;// 1. 将新元素 x 插入到合适的堆中if lower.is_empty() || lower.peek().unwrap() x {lower.push(x);lower_sum x;} else {upper.push(Reverse(x));upper_sum x;}// 2. 平衡两个堆的大小保证 lower 的大小 upper 的大小// 且 lower 的大小最多比 upper 大 1if lower.len() upper.len() 1 {// lower 太大了把堆顶最大值移到 upperif let Some(top) lower.pop() {lower_sum - top;upper.push(Reverse(top));upper_sum top;}} else if upper.len() lower.len() {// upper 太大了把堆顶最小值移到 lowerif let Some(Reverse(top)) upper.pop() {upper_sum - top;lower.push(top);lower_sum top;}}// 3. 计算当前前缀的最小操作数let res if (i 1) % 2 0 {// 偶数个元素中位数可以是中间两个数的任意值这里用 upper 的最小值// 代价 upper_sum - lower_sum(upper_sum - lower_sum) % MOD} else {// 奇数个元素中位数是 lower 的最大值// 代价 (upper_sum - lower_sum) lower.peek().unwrap()let median *lower.peek().unwrap();(upper_sum - lower_sum median) % MOD};// 确保结果非负ans.push(((res % MOD MOD) % MOD) as i32);}ans}}复杂度分析· 时间复杂度: O(n log n)其中 n 是数组长度。每个元素执行常数次堆的插入和删除操作。· 空间复杂度: O(n)用于存储两个堆。总结这个实现将复杂的数列操作问题通过 nums[i] - i 的转化变成了经典的中位数问题并利用两个堆对顶堆在遍历过程中动态维护中位数从而高效地计算出每个前缀的最小操作数。
延伸阅读

更多相关文章

2026/10/24 3:41:36

JDBC学习_API

APIconnectionStatementResultSetpreparedStatementDriud连接池

2026/10/23 1:26:38

海外版外卖结算:账本归属与导出字段设计

中东市区综合运营商做海外版外卖结算,卡点经常不是「会不会出报表」。 要问账本落在谁的 schema、能否按字段目录导出、币种与订单归属是否可复现。 数据若只在实施方笔记本里的 CSV,结算完成了账仍不在自己库。 下文从 ledger 分录、托管范围和导出契…

2026/10/21 16:42:44

Nano-VLLM全代码解析笔记(4)-model_runner

当前笔记顺序Engine(当前model_runner.py)->LayersEngine的运行架构(总结时或者弄不清一些调用顺序时看):model_runner.py(最难的一个,要理清kv_cache的逻辑与物理分配的关系,建议配合总结的图一起看,另外这里很多设…

2026/10/24 3:43:06

华为交换机Hybrid接口原理与实战配置指南

1. 什么是Hybrid接口?它到底解决什么实际问题?在华为交换机的实际运维现场,我见过太多人把Hybrid接口当成“高级版Access”或“简化版Trunk”,结果配完发现VLAN通信完全不对——要么所有端口泛洪广播,要么终端根本上不…

2026/10/24 3:43:06

Linux文件系统管理实战:从基础到高级技巧

1. Linux文件系统管理基础认知刚接触Linux时,最让我困惑的就是那个神秘的根目录结构。与Windows的盘符划分不同,Linux将所有存储设备都挂载到统一的目录树下。这种设计就像把整个城市的道路网整合成一张大地图,无论你新增多少条街道&#xff…

2026/10/24 3:43:06

银行科技岗计算机笔试高频考点与刷题策略

1. 这类笔试考的不是深度,是覆盖面和手速第一次坐到银行科技岗笔试的机考位子上,很多人会有点错愕——第一道专业题不是让你写代码,也不是让你设计架构,而是"某处理器主频2GHz,执行一条指令平均需要4个时钟周期&a…

2026/10/24 3:38:06

常用AI网站和学术搜索引擎

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/23 22:56:35

金融AI落地指南:从调研报告到技术选型与工程实践

简介:这份PDF报告聚焦2025年金融服务业中国AI现状与趋势,面向金融科技从业者、AI战略规划人员及关注行业数字化转型的研究者,帮助读者把握生成式AI在银行、支付、交易等场景中的落地路径与投资方向。资源包内含1个PDF文件,大小约1…

2026/10/24 0:02:40

MATLAB缩进快捷键与批量格式化实战指南

1. 被自动缩进折磨的那些年如果你写过MATLAB代码,大概率经历过这种场景:从某个文档、网页或者聊天记录里复制了一段代码,粘贴进编辑器之后,每一行前面都带着莫名其妙的空格,有的行首是四个空格,有的是一个T…

2026/10/24 0:02:40

用Poco实现Qt风格信号与槽的跨平台C++方案

简介:本资源是一份面向C中级开发者的技术实践工程,聚焦于在非Qt框架环境下模拟实现Qt核心通信机制——信号与槽,借助Poco网络库的事件系统完成解耦式对象通信。适用于需在跨平台C项目中引入松耦合回调机制、但受限于无法集成Qt依赖的开发场景…

2026/10/24 0:02:40

ESXi裸机虚拟化安装指南:从硬件兼容到虚拟机部署

1. 为什么还要折腾ESXi:从一台闲置机器说起手里攒了几台淘汰下来的迷你主机,配置不算差,i5加16G内存,扔了可惜,装个桌面系统又觉得浪费。这种场景下,ESXi就成了一个绕不开的选择。它是一套裸机虚拟化平台&a…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑