当前位置: 首页 > news >正文

DeepSeek LeetCode 3785. 避免禁用值的最小交换次数 Java实现

根据我的深入分析,LeetCode 3785: Minimum Swaps to Avoid Forbidden Values 的正确解法是使用 `max(⌈badPairsSum / 2⌉, maxBadPairs)` 公式,但需要注意一个已知的边界情况争议。

问题分析

核心思路:
1. 坏位置 (Bad Position):`nums[i] == forbidden[i]` 的位置
2. 频率检查:如果某个值在 `nums` 和 `forbidden` 中出现总次数超过 `n`,则不可能完成,返回 `-1`
3. 关键观察:每次交换可以修复最多 2 个坏位置

正确 Java 实现

```java
import java.util.*;

class Solution {
public int minSwaps(int[] nums, int[] forbidden) {
int n = nums.length;

// Step 1: 频率检查 - 判断是否有解
Map<Integer, Integer> freq = new HashMap<>();
for (int x : nums) {
freq.put(x, freq.getOrDefault(x, 0) + 1);
}
for (int x : forbidden) {
freq.put(x, freq.getOrDefault(x, 0) + 1);
}

for (int count : freq.values()) {
if (count > n) {
return -1;
}
}

// Step 2: 统计坏位置
Map<Integer, Integer> badPairs = new HashMap<>();
int badPairsSum = 0;

for (int i = 0; i < n; i++) {
if (nums[i] == forbidden[i]) {
badPairs.put(nums[i], badPairs.getOrDefault(nums[i], 0) + 1);
badPairsSum++;
}
}

if (badPairsSum == 0) {
return 0;
}

// Step 3: 找到最大坏位置数
int maxBadPairs = 0;
for (int count : badPairs.values()) {
maxBadPairs = Math.max(maxBadPairs, count);
}

// Step 4: 核心公式
// ⌈badPairsSum / 2⌉ = (badPairsSum + 1) / 2
return Math.max((badPairsSum + 1) / 2, maxBadPairs);
}
}
```

公式解释

`max(⌈badPairsSum / 2⌉, maxBadPairs)` 的含义:

1. `⌈badPairsSum / 2⌉`:每次交换最多修复 2 个坏位置,所以至少需要这么多交换
2. `maxBadPairs`:如果某个值出现了 `maxBadPairs` 次坏位置,这些位置之间不能互相交换(交换相同值无意义),必须与其他值交换。如果其他坏位置不够,就需要与好位置交换

关于已知争议

GitHub 上有用户报告了一个反例:
- `nums = [6,6,8,8,8,9,9,9,4,4]`
- `forbidden = [6,6,8,8,8,9,9,9,6,6]`

声称公式给出 4 但实际需要 5。但经过我的详细验证,这个反例实际上可以用 4 次交换完成:

```
Swap 1: pos 0(6) ↔ pos 2(8) → [8,6,6,8,8,9,9,9,4,4]
Swap 2: pos 1(6) ↔ pos 5(9) → [8,9,6,8,8,6,9,9,4,4]
Swap 3: pos 3(8) ↔ pos 6(9) → [8,9,6,9,8,6,8,9,4,4]
Swap 4: pos 4(8) ↔ pos 7(9) → [8,9,6,9,9,6,8,8,4,4]
```

最终所有位置都满足 `nums[i] != forbidden[i]`,所以公式是正确的。

复杂度分析

- 时间复杂度:O(n)
- 空间复杂度:O(n)(用于哈希表)

这个解法简洁高效,是 LeetCode 官方期望的解法。

http://www.jsqmd.com/news/1293326/

相关文章:

  • 2026年降低运行成本的污水处理托管运营推荐:药剂成本优化服务商选择指南 - 全域品牌推荐
  • Greasy Fork终极指南:5分钟掌握网页定制魔法,解锁浏览器超能力
  • Python金融大数据分析:股票预测系统实战
  • OpenClaw开源智能代理框架:多模态AI开发实战指南
  • 抖音下载器:从零开始构建个人内容库的完整指南
  • 单片机计算机毕设之基于嵌入式单片机的液位温度测控系统设计 基于 STM32 的常温加热双模式饮水装置控制系统(012101)
  • 介绍 DS随心转批量导出国产 AI 多轮对话并免费生成 Markdown 底稿的流程,包含格式选择、能力边界和隐私复核。
  • 移动与工业、智能互联网时代,华为技术专利水平到底怎么样
  • JavaScript 多人协作的“修罗场”:如何优雅地规避函数重名问题?
  • 如何用Python一键备份QQ空间:完整记忆归档终极指南
  • 2026年福建背贴式止水带厂家挑选攻略:博力橡塑等品牌实测梳理 - 浩了个浩
  • 2026运输发票价税分离:AI自动判断旅客信息缺失场景的合规处理
  • Linux NPU固件优化:YOLOv8推理延迟降低40%实战
  • 家用电脑本地部署AI大模型:Ollama实战指南与隐私安全实践
  • 甲骨文推 EBCDIC 兼容特性助力大型机迁移,是机遇还是供应商锁定新挑战?
  • 大厂Java技术栈与微服务架构深度解析
  • URL解码后字符串处理:编码识别、场景化策略与Python实践
  • 线束工程全解析:从基础概念到设计制造实践
  • 基于PINN的三维声波方程无网格求解MATLAB实践
  • 告别低效写作:AI论文写作工具测评与推荐
  • AI营销员工:商业逻辑、落地步骤与转型指南
  • 潍坊鼻炎相关问题怎么选?专业机构给出实用建议
  • 【维克】线性回归入门:用一条线预测未来
  • 2027软考高项新考情下,培训机构筛选标准全解析
  • 2026年佛山支持配送到家的水泥供应商有哪些? - 品牌排行榜
  • 2026年山樟木天然耐腐特性与行业应用观察 - 万相科技
  • 武汉科谷技工学校 2026 年招生办咨询信息公示 - 升学择校早知道
  • 3种智能授权引擎:重新定义软件授权管理的技术架构
  • Qt核心知识地图:从信号槽到多线程的实战指南
  • 学术论文投稿前29个细节检查清单:从格式规范到图表优化的全流程指南