Kimi    LeetCode 3505. 使 K 个子数组内元素相等的最少操作数 Rust实现 以下是 LeetCode 3505. 使 K 个子数组内元素相等的最少操作数的 Rust 实现---思路概述本题是 LeetCode 462最小操作次数使数组元素相等 II和 LeetCode 480滑动窗口中位数的结合题。核心思路1. 中位数贪心对于一个子数组要使其所有元素相等且操作次数最少最终值应取子数组的中位数。2. 滑动窗口中位数用对顶堆两个 BTreeMap 延迟删除维护长度为 x 的滑动窗口快速求出每个窗口变为相等的最小操作次数 cost[i]。3. 划分型 DPdp[i][j] 表示前 i 个元素中选出 j 个不重叠的长度为 x 的子数组的最小操作数。---完整 Rust 代码rustuse std::collections::BTreeMap;struct DualHeap {small: BTreeMapi32, i32, // max-heap for smaller half (largest at end)large: BTreeMapi32, i32, // min-heap for larger half (smallest at start)delayed: BTreeMapi32, i32, // lazy deletion mapsmall_size: i32,large_size: i32,small_sum: i64,large_sum: i64,small_target: i32,large_target: i32,}impl DualHeap {fn new(k: i32) - Self {DualHeap {small: BTreeMap::new(),large: BTreeMap::new(),delayed: BTreeMap::new(),small_size: 0,large_size: 0,small_sum: 0,large_sum: 0,small_target: k / 2,large_target: k - k / 2,}}fn insert(mut self, num: i32) {if self.small.is_empty() || num *self.small.iter().next_back().unwrap().0 {*self.small.entry(num).or_insert(0) 1;self.small_sum num as i64;self.small_size 1;} else {*self.large.entry(num).or_insert(0) 1;self.large_sum num as i64;self.large_size 1;}self.make_balance();}fn erase(mut self, num: i32) {*self.delayed.entry(num).or_insert(0) 1;if num *self.small.iter().next_back().unwrap().0 {self.small_size - 1;self.small_sum - num as i64;if num *self.small.iter().next_back().unwrap().0 {self.prune_small();}} else {self.large_size - 1;self.large_sum - num as i64;if *self.large.iter().next().unwrap().0 num {self.prune_large();}}self.make_balance();}fn get_median(self) - i32 {*self.large.iter().next().unwrap().0}fn get_cost(self) - i64 {let median self.get_median();let cost_small median as i64 * self.small_size as i64 - self.small_sum;let cost_large self.large_sum - median as i64 * self.large_size as i64;cost_small cost_large}fn make_balance(mut self) {if self.small_size self.small_target {let (num, cnt) self.small.iter().next_back().unwrap();if cnt 1 {self.small.remove(num);} else {self.small.insert(num, cnt - 1);}self.small_sum - num as i64;self.small_size - 1;*self.large.entry(num).or_insert(0) 1;self.large_sum num as i64;self.large_size 1;self.prune_small();} else if self.large_size self.large_target {let (num, cnt) self.large.iter().next().unwrap();if cnt 1 {self.large.remove(num);} else {self.large.insert(num, cnt - 1);}self.large_sum - num as i64;self.large_size - 1;*self.small.entry(num).or_insert(0) 1;self.small_sum num as i64;self.small_size 1;self.prune_large();}}fn prune_small(mut self) {while let Some((num, cnt)) self.small.iter().next_back() {if let Some(dc) self.delayed.get(num) {if dc 0 {if dc 1 {self.delayed.remove(num);} else {self.delayed.insert(num, dc - 1);}if cnt 1 {self.small.remove(num);} else {self.small.insert(num, cnt - 1);}} else {break;}} else {break;}}}fn prune_large(mut self) {while let Some((num, cnt)) self.large.iter().next() {if let Some(dc) self.delayed.get(num) {if dc 0 {if dc 1 {self.delayed.remove(num);} else {self.delayed.insert(num, dc - 1);}if cnt 1 {self.large.remove(num);} else {self.large.insert(num, cnt - 1);}} else {break;}} else {break;}}}}struct Solution;impl Solution {pub fn min_operations(nums: Veci32, x: i32, k: i32) - i64 {let n nums.len();let x x as usize;let k k as usize;let inf: i64 1e18 as i64;let mut cost vec![inf; n];let mut dh DualHeap::new(x as i32);for i in 0..x {dh.insert(nums[i]);}cost[x - 1] dh.get_cost();for i in x..n {dh.insert(nums[i]);dh.erase(nums[i - x]);cost[i] dh.get_cost();}let mut dp vec![vec![inf; k 1]; n 1];dp[0][0] 0;for i in 1..n {for j in 0..k {dp[i][j] dp[i - 1][j];if i x j 1 cost[i - 1] inf {dp[i][j] dp[i][j].min(dp[i - x][j - 1] cost[i - 1]);}}}dp[n][k]}}---复杂度分析项目 复杂度时间 O(n log x · k) — 滑动窗口 O(n log x)DP O(nk)空间 O(n x nk) — cost 数组 O(n)对顶堆 O(x)DP 数组 O(nk)由于 k ≤ 15nk 最大约为 1.5 × 10⁶空间可接受。---下载链接[LeetCode3505.rs](sandbox:///mnt/agents/output/LeetCode3505.rs)

相关新闻

最新新闻

RPG-Maker-MV-Decrypter:三步掌握游戏资源提取与解密的终极指南

RPG-Maker-MV-Decrypter:三步掌握游戏资源提取与解密的终极指南

RPG-Maker-MV-Decrypter:三步掌握游戏资源提取与解密的终极指南 【免费下载链接】RPG-Maker-MV-Decrypter You can decrypt RPG-Maker-MV Resource Files with this project ~ If you dont wanna download it, you can use the Script on my HP: 项目地址: https:…

2026/7/8 8:09:21
为什么雨天施工更需要全防水安全鞋?老师傅分享真实经验!

为什么雨天施工更需要全防水安全鞋?老师傅分享真实经验!

每年进入雨季,建筑工地、电力施工、水务工程、物流运输等户外行业都会面临一个共同的问题——鞋子进水。 很多人觉得鞋湿了只是脚不舒服,但对于长期在工地工作的老师傅来说,真正担心的不只是湿脚,而是打滑、脚部长期潮湿、工作效…

2026/7/8 8:09:21
【工具推荐】开发一个网页快照工具:从需求到落地的完整复盘

【工具推荐】开发一个网页快照工具:从需求到落地的完整复盘

本文记录我独立完成 SnapPage 这个项目的全过程,包括需求分析、技术选型、踩坑记录和产品思考。项目为非开源的私人作品,仅供学习交流。 一、为什么要做这个工具 平时上网收藏了不少文章和网页,但时间久了问题接踵而至: 收藏的链…

2026/7/8 8:09:21
花19.9元用四方智播,把直播团队成本打下来

花19.9元用四方智播,把直播团队成本打下来

在2026年直播电商进入“拼内功”的下半场,高昂的主播薪资、场控成本与场地费用,正成为压垮中小商家的“三座大山”。本选题旨在打破“直播高投入”的传统认知,通过“四方智播”的实战拆解,向中小商家展示一种“极简、极低成本、极…

2026/7/8 8:09:21
3分钟学会Blender 3MF插件:让3D打印文件处理变得如此简单!

3分钟学会Blender 3MF插件:让3D打印文件处理变得如此简单!

3分钟学会Blender 3MF插件:让3D打印文件处理变得如此简单! 【免费下载链接】Blender3mfFormat Blender add-on to import/export 3MF files 项目地址: https://gitcode.com/gh_mirrors/bl/Blender3mfFormat 你是否曾为3D打印文件格式的局限性而烦…

2026/7/8 8:09:21
glm-5.2 + Continue.dev 接入配置教程:标准版与 AMD 加速版 endpoint 两处差异,填错直接 503

glm-5.2 + Continue.dev 接入配置教程:标准版与 AMD 加速版 endpoint 两处差异,填错直接 503

上周三智谱正式放出 glm-5.2,我当天就想把它塞进 Continue.dev 当日常 copilot 用。结果折腾了大半个下午——标准版 10 分钟跑通了,但 AMD 加速版的 endpoint 和 model_id 跟标准版有两处不一样,填错一个就是 503 Service Unavailable&#…

2026/7/8 8:04:21

月新闻