文章目录
- 1. 题目
- 2. 解题
1. 题目
给你两个整数数组 source 和 target ,长度都是 n 。
还有一个数组 allowedSwaps ,其中每个 allowedSwaps[i] = [ai, bi]
表示你可以交换数组 source 中下标为 ai 和 bi(下标从 0 开始)的两个元素。
注意,你可以按 任意 顺序 多次 交换一对特定下标指向的元素。
相同长度的两个数组 source 和 target 间的 汉明距离 是元素不同的下标数量。
形式上,其值等于满足 source[i] != target[i]
(下标从 0 开始)的下标 i(0 <= i <= n-1)的数量。
在对数组 source 执行 任意 数量的交换操作后,返回 source 和 target 间的 最小汉明距离 。
示例 1:
输入: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 。示例 2:
输入:source = [1,2,3,4], target = [1,3,2,4],
allowedSwaps = []
输出:2
解释:不能对 source 执行交换操作。
source 和 target 间的汉明距离是 2 ,
二者有 2 处元素不同,在下标 1 和下标 2 。示例 3:
输入:source = [5,1,2,4,3], target = [1,5,4,2,3],
allowedSwaps = [[0,4],[4,2],[1,3],[1,4]]
输出:0提示:
n == source.length == target.length
1 <= n <= 10^5
1 <= source[i], target[i] <= 10^5
0 <= allowedSwaps.length <= 10^5
allowedSwaps[i].length == 2
0 <= ai, bi <= n - 1
ai != bi
https://leetcode-cn.com/problems/minimize-hamming-distance-after-swap-operations/
2. 解题
并查集学习,请点击
- 对可以交换的下标位置,使用并查集进行合并
- 对 source 数组中每个位置的数,属于哪个集合,计数
- 遍历 target 数组,对每个位置的数,查看对应集合,看是否存在,记录数量,并更新计数
class dsu // 并查集
{
public:vector<int> f;dsu(int n){f.resize(n);for(int i = 0; i < n; i++)f[i] = i;}void merge(int a, int b){int fa = find(a);int fb = find(b);f[fa] = fb;}int find(int a){if(a == f[a])return a;return f[a] = find(f[a]);}
};
class Solution {
public:int minimumHammingDistance(vector<int>& source, vector<int>& target, vector<vector<int>>& allowedSwaps) {int n = source.size();dsu u(n);for(auto& a : allowedSwaps)u.merge(a[0], a[1]);int same = 0;unordered_map<int,unordered_map<int,int>> m;for(int i = 0; i < n; i++){int fa = u.find(i);m[fa][source[i]]++;}for(int i = 0; i < n; i++){int fa = u.find(i);if(m[fa][target[i]] > 0){same++;m[fa][target[i]]--;}}return n-same;}
};
908 ms 145.2 MB C++
我的CSDN博客地址 https://michael.blog.csdn.net/
长按或扫码关注我的公众号(Michael阿明),一起加油、一起学习进步!