LeetCode 1722. 执行交换操作后的最小汉明距离 题解

news2025/7/11 10:33:43

示例:

输入:source = [1,2,3,4], target = [2,1,4,5], allowedSwaps = [[0,1],[2,3]]
输出:1
解释:source 可以按下述方式转换:
- 交换下标 0 和 1 指向的元素:source = [2,1,3,4]
- 交换下标 2 和 3 指向的元素:source = [2,1,4,3]
source 和 target 间的汉明距离是 1 ,二者有 1 处元素不同,在下标 3 。

数据范围

- n == source.length == target.length
- 1 <= n <= 105
- 1 <= source[i], target[i] <= 105
- 0 <= allowedSwaps.length <= 105
- allowedSwaps[i].length == 2
- 0 <= ai, bi <= n - 1
- ai != bi

我的解题思路

根据target和source的数组长度设置一个boolean的二维数组去制定访问规则,初始化时使得source下标对应的target下标都可以被访问,因为会出现这类数组target=[1,2,3,4],source=[1,3,2,4],此时我们不管是否存在交换我们都得去验证一下target[i]是否与source[i]相等。
之后就根据allowedSwaps这个数组去将[0,1]和[2,3]做交换,说是做交换其实就是去改变二维数组中的值,将其改成true,使其可以被访问,然后对比,忘了说明,对于这个二维数组,其实bool[i][j]i代表的是target数组的下标j代表的是source数组的下标,这样就能很好的遍历然后进行对比。

这是我一开始认为的处理方式,后面提交后看测试样例,发现此题远不止此,首先对于交换数组allowedSwaps[]其可能出现该情况allowedSwaps[[0,1],[0,4]]这表明其实[1,4]也是可以交换的,所以我们在构建二维数组时也得将[1][4]和[4,1]变成true,所以在这个地方我就无所适从了,没法找到属于自己的解决方法,即使找到了,是不是会超时呢,这个也要打上一个问号

那么原题的解决方法是并查集,并查集的解决思路是,如图所示

    class UnionFind {
        int[] parent;

        public UnionFind(int n) {
            parent = new int[n];
            for (int i = 0; i < n; i++) parent[i] = i;
        }

        public int find(int x) {
            if (parent[x] != x)
                parent[x] = find(parent[x]);
            return parent[x];
        }

        public void union(int x, int y) {
            parent[find(x)] = find(y);
        }
    }

根节点合并的过程,然后使用map维护,将不同根节点的数字(下标)分组

        Map<Integer, List<Integer>> groups = new HashMap<>();
        for (int i = 0; i < n; i++) {
            int root = uf.find(i);
            groups.computeIfAbsent(root, k -> new ArrayList<>()).add(i);
        }

以上是我第一个不会的点和犯的错,之后还有第二个点错误

        boolean[][]  ans = new boolean[n][n];

        for(int i=0;i<n;i++){
            Arrays.fill(ans[i],false);
        }
        for(int i=0;i<n;i++){
            ans[i][i] = true;
        }
        //对每组内部下标打标记
        for (List<Integer> group : groups.values()) {
            for (int i : group) {
                for (int j : group) {
                    if (i != j) {
                        ans[i][j] = true;
                    }
                }
            }
        }

        int num = 0;
        for(int i=0;i<n;i++){
            boolean plain = true;
            for(int j=0;j<n;j++){
                if(ans[i][j]){
                    if(target[i]==source[j]){
                        plain=false;
                        break;
                    }
                }
            }

            System.out.println(plain);
            //计数问题
            if(plain){
                num++;
            }
        }

之后我还是沿用上述思路,因为用并查集解决了数组的问题,我便认为可以就这么使用二维数组解决,结果不仅仅碰到了内存超出限制的问题还遇到了计数问题,现在我继续带大家看看我的思路和出现的问题

内存超出限制的问题是因为我们开了一个boolean的二维数组导致的,而计数问题是因为以上代码是根据target[i]==source[j]判断是否存在相同的值就可以了,但并没有考虑过是否已经在之前使用过了,所以这里我们也得使用map进行计数统计,防止算多了

        int res = 0;
        for (List<Integer> group : groups.values()) {
            Map<Integer, Integer> freq = new HashMap<>();

            // count source values
            for (int idx : group) {
                freq.put(source[idx], freq.getOrDefault(source[idx], 0) + 1);
            }

            // try to cancel with target values
            for (int idx : group) {
                int t = target[idx];
                if (freq.getOrDefault(t, 0) > 0) {
                    freq.put(t, freq.get(t) - 1);
                } else {
                    res++; // unmatched element
                }
            }
        }
        
        return res;

所以最后答案如下:

class Solution {
    public int minimumHammingDistance(int[] source, int[] target, int[][] allowedSwaps) {
        int n = target.length;
        int m = allowedSwaps.length;

        UnionFind uf = new UnionFind(n);

        for (int[] pair : allowedSwaps) {
            uf.union(pair[0], pair[1]);
        }

        Map<Integer, List<Integer>> groups = new HashMap<>();
        for (int i = 0; i < n; i++) {
            int root = uf.find(i);
            groups.computeIfAbsent(root, k -> new ArrayList<>()).add(i);
        }
        for (Map.Entry<Integer, List<Integer>> entry : groups.entrySet()) {
            System.out.println("Root: " + entry.getKey() + ", Group: " + entry.getValue());
        }
        int res = 0;
        for (List<Integer> group : groups.values()) {
            Map<Integer, Integer> freq = new HashMap<>();

            // count source values
            for (int idx : group) {
                freq.put(source[idx], freq.getOrDefault(source[idx], 0) + 1);
            }

            // try to cancel with target values
            for (int idx : group) {
                int t = target[idx];
                if (freq.getOrDefault(t, 0) > 0) {
                    freq.put(t, freq.get(t) - 1);
                } else {
                    res++; // unmatched element
                }
            }
        }
        
        return res;
    }

    class UnionFind {
        int[] parent;

        public UnionFind(int n) {
            parent = new int[n];
            for (int i = 0; i < n; i++) parent[i] = i;
        }

        public int find(int x) {
            if (parent[x] != x)
                parent[x] = find(parent[x]);
            return parent[x];
        }

        public void union(int x, int y) {
            parent[find(x)] = find(y);
        }
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2372113.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

linux ptrace 图文详解(八) gdb跟踪被调试程序的子线程、子进程

目录 一、gdb跟踪被调试程序的fork、pthread_create操作 二、实现原理 三、代码实现 四、总结 &#xff08;代码&#xff1a;linux 6.3.1&#xff0c;架构&#xff1a;arm64&#xff09; One look is worth a thousand words. —— Tess Flanders 相关链接&#xff1a; …

游戏:用python写梦幻西游脚本(谢苏)

《梦幻西游》是一款受欢迎的网络游戏&#xff0c;许多玩家希望通过脚本来增强游戏体验&#xff0c;比如自动打怪、自动治疗等。本文将为您展示一个用Python编写简单《梦幻西游》自动打怪脚本的方案。 需求分析 1.1 具体问题 在《梦幻西游》中&#xff0c;玩家需要频繁与怪物进行…

Spring Boot 3.x集成SaToken使用swagger3+knife4j 4.X生成接口文档

说一说Spring Boot 3.X集成SaToken使用swagger3并使用第三方的knife4j踩过的坑&#xff0c;废话不多说直接上正题&#xff0c;SaToken的我就不贴了 第一步当然是要先导入相关的依赖&#xff0c;包括swagger和knife4j&#xff0c;如下 <dependency><groupId>com.gi…

用Python监控金价并实现自动提醒!附完整源码

&#x1f482; 个人网站:【 摸鱼游戏】【神级代码资源网站】【星海网址导航】&#x1f4bb;香港大宽带-4H4G 20M只要36/月&#x1f449; 点此查看详情 在日常投资中&#xff0c;很多朋友喜欢在一些平台买点黄金&#xff0c;低买高卖赚点小差价。但黄金价格实时波动频繁&#xf…

ChatTempMail - AI驱动的免费临时邮箱服务

在当今数字世界中&#xff0c;保护在线隐私的需求日益增长。ChatTempMail应运而生&#xff0c;作为一款融合人工智能技术的新一代临时邮箱服务&#xff0c;它不仅提供传统临时邮箱的基本功能&#xff0c;还通过AI技术大幅提升了用户体验。 核心功能与特性 1. AI驱动的智能邮件…

掌握单元测试:提升软件质量的关键步骤

介绍 测试&#xff1a;是一种用来促进鉴定软件的正确性、完整性、安全性和质量的过程。 阶段划分&#xff1a;单元测试、集成测试、系统测试、验收测试。 测试方法&#xff1a;白盒测试、黑盒测试及灰盒测试。 单元测试&#xff1a;就是针对最小的功能单元&#xff08;方法&…

YOLOv1模型架构、损失值、NMS极大值抑制

文章目录 前言一、YOLO系列v11、核心思想2、流程解析 二、损失函数1、位置误差2、置信度误差3、类别概率损失 三、NMS&#xff08;非极大值抑制&#xff09;总结YOLOv1的优缺点 前言 YOLOv1&#xff08;You Only Look Once: Unified, Real-Time Object Detection&#xff09;由…

【论文阅读】——Articulate AnyMesh: Open-Vocabulary 3D Articulated Objects Modeling

文章目录 摘要一、介绍二、相关工作2.1. 铰接对象建模2.2. 部件感知3D生成 三、方法3.1. 概述3.2. 通过VLM助手进行可移动部件分割3.3. 通过几何感知视觉提示的发音估计3.4. 通过随机关节状态进行细化 四、实验4.1. 定量实验发音估计设置: 4.2. 应用程序 五、结论六、思考 摘要…

HarmonyOS基本的应用的配置

鸿蒙HarmonyOS组建页面 1、创建ets文件并配置2、修改main_pages.json文件3、修改EntryAbility.ets文件&#xff08;启动时加载的页面&#xff09; 1、创建ets文件并配置 Index.ets是创建项目自动构建生成的&#xff0c;我们可以将其删除掉&#xff0c;并重新在page文件夹下创建…

【redis】集群模式

Redis Cluster是Redis官方推出的分布式解决方案&#xff0c;旨在通过数据分片、高可用和动态扩展能力满足大规模数据存储与高并发访问的需求。其核心机制基于虚拟槽分区&#xff0c;将16384个哈希槽均匀分配给集群中的主节点&#xff0c;每个键通过CRC16哈希算法映射到特定槽位…

DeepSeek实战--微调

1.为什么是微调 &#xff1f; 微调LLM&#xff08;Fine-tuning Large Language Models&#xff09; 是指基于预训练好的大型语言模型&#xff08;如GPT、LLaMA、PaLM等&#xff09;&#xff0c;通过特定领域或任务的数据进一步训练&#xff0c;使其适应具体需求的过程。它是将…

移动端前端开发中常用的css

在开发移动端项目的时候&#xff0c;很多样式都是相同的&#xff0c;比如说图标大小&#xff0c;头像大小&#xff0c;页面底部保存(添加按钮&#xff09;&#xff0c;项目主体颜色等等&#xff0c;对于这些在项目中常用到的&#xff0c;通常都会写在公共样式中&#xff08;pub…

Linux安装Weblogic 教程

前言 WebLogic 是一个由 Oracle 提供的企业级应用服务器&#xff0c;广泛用于部署和管理 Java EE&#xff08;Enterprise Edition&#xff09;应用程序。它支持多种服务&#xff0c;包括 Web 服务、企业信息系统、消息驱动的应用等。它是一个强大的应用服务器&#xff0c;旨在…

flutter 的热更新方案shorebird

Flutter 热修复&#xff08;Shorebird&#xff09;_flutter shorebird-CSDN博客 Preview Locally | ShorebirdLearn how to preview an existing release of your application.https://docs.shorebird.dev/code-push/preview/ 控制台&#xff1a; Shorebird Console 文档&…

创建型模式:抽象工厂(Abstract Factory)模式

一、概念与核心思想​ 抽象工厂(Abstract Factory)模式是创建型设计模式的重要成员,它提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。该模式将对象的创建逻辑封装在抽象工厂及其具体实现类中,客户端通过抽象工厂接口获取所需的对象族,实现对象创…

PDF文档解析新突破:图表识别、公式还原、手写字体处理,让AI真正读懂复杂文档!

要想LLM大模型性能更佳&#xff0c;我们需要喂给模型看得懂的高质量数据。那有没有一种方法&#xff0c;能让我们把各种文档“读懂”&#xff0c;再喂给大模型使用呢&#xff1f; 如果你用传统OCR工具直接从PDF中提取文本&#xff0c;结果往往是乱序、缺失、格式错乱。因为实际…

Redis 主从复制集群搭建教程

目录 为什么要搭建 Redis 主从复制集群&#xff1f;搭建 Redis 主从复制集群前提条件步骤一&#xff1a;创建 Docker 网络步骤二&#xff1a;启动 Redis 主节点步骤三&#xff1a;启动 Redis 从节点步骤四&#xff1a;验证复制状态步骤五&#xff1a;使用 Python 连接 Redis 集…

共模电感在开关电源交流侧的应用原理与原因

在开关电源的设计中&#xff0c;共模电感是一个关键的电子元件&#xff0c;它常被连接在开关电源的交流一侧。然而&#xff0c;很多人虽然对共模电感并不陌生&#xff0c;但对于它为何要接在交流一侧&#xff0c;可能并没有深入理解。接下来&#xff0c;我们将详细探讨共模电感…

MySQL——七、索引

优势&#xff1a;极高查询效率&#xff1b;极高排序效率 劣势&#xff1a;占用磁盘空间&#xff1b;降低更新表的速度&#xff08;可忽略&#xff0c;磁盘相对便宜&#xff1b;增删改比例较小&#xff09; 索引结构 MYSQL的索引是在存储引擎层实现的&#xff0c;不同的存储引…

HTML应用指南:利用POST请求获取全国德邦快递服务网点位置信息

德邦快递作为中国领先的综合性物流服务提供商,自1996年成立以来,始终致力于为客户提供高效、安全的大件快递及其他物流解决方案。德邦快递凭借其强大的直营模式、“最后一公里”的优质服务以及对科技的持续投入,在竞争激烈的物流市场中占据了重要位置。特别是在大件快递领域…