千问 LeetCode 3785. 避免禁用值的最小交换次数 Rust实现

发布时间:2026/9/18 12:11:26
千问    LeetCode 3785. 避免禁用值的最小交换次数 Rust实现 在 Rust 中实现这道题我们需要利用 HashMap 来进行频次统计。由于 Rust 的所有权机制和严格的类型检查我们在遍历和更新哈希表时通常会使用 entry API 来优雅地处理键不存在的情况。Rust 代码实现use std::collections::HashMap;impl Solution {pub fn min_swaps(nums: Veci32, forbidden: Veci32) - i32 {let n nums.len() as i32;let mut total_freq: HashMapi32, i32 HashMap::new();// 1. 统计 nums 和 forbidden 中每个数字的总出现次数for i in 0..nums.len() {*total_freq.entry(nums[i]).or_insert(0) 1;*total_freq.entry(forbidden[i]).or_insert(0) 1;}// 2. 鸽巢原理如果某个数字总出现次数超过 n则无解for freq in total_freq.values() {if freq n {return -1;}}// 3. 统计“坏位置”nums[i] forbidden[i]及其对应值的频次let mut bad_freq: HashMapi32, i32 HashMap::new();let mut bad_sum: i32 0; // 坏位置的总数let mut max_bad: i32 0; // 单个坏值出现的最大频次for i in 0..nums.len() {if nums[i] forbidden[i] {let count bad_freq.entry(nums[i]).or_insert(0);*count 1;bad_sum 1;max_bad max_bad.max(*count);}}// 4. 贪心计算最小交换次数// 公式max(ceil(bad_sum / 2), max_bad)// 在 Rust 中(bad_sum 1) / 2 可以安全地实现向上取整((bad_sum 1) / 2).max(max_bad)}}核心语法与逻辑说明1. entry().or_insert(0)这是 Rust 中操作 HashMap 的惯用写法。如果 nums[i] 在 map 中不存在它会插入一个默认值 0 并返回该值的可变引用如果已存在则直接返回已有值的引用。这避免了重复的 contains_key 检查。2. 向上取整Python 中的 (bad_sum 1) // 2 在 Rust 中对应 (bad_sum 1) / 2。因为 bad_sum 是整数Rust 的整数除法默认向下取整加 1 后再除 2 完美实现了 ceil(bad_sum / 2) 的效果。3. .max() 方法Rust 标准库为整数类型提供了 .max(other) 方法可以直接取两者中的最大值代码比 Python 的 max(a, b) 更加面向对象。复杂度分析* 时间复杂度O(n)其中 n 是数组长度。我们仅对数组进行了常数次线性遍历且 HashMap 的插入和查询平均时间复杂度为 O(1)。* 空间复杂度O(n)主要用于存储 total_freq 和 bad_freq 两个哈希表在最坏情况下需要存储 2n 个键值对。需要我帮你写几组测试用例来验证一下 Rust 实现的正确性吗

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询