LC上一道有趣的并查集题目

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

给你两个整数数组 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 间的 ******最小汉明距离****** 。
(链接:https://leetcode-cn.com/problems/minimize-hamming-distance-after-swap-operations)

这里解读一下题目:

1. 在allowedSwaps[i]里面, 只允许交换source数组中两个不同位置的值;
2. 交换的顺序和次数都是任意, 说明只要两个值可以交换, 这两个值就能交换, 并且交换后不影响其他值的相对位置
3. 汉明距离是指target和source中同一个索引位置, 但值不同的数量
4. 该题是求最小的汉明距离, 因此, 要利用allowedSwaps数组, 使tager和source中尽可能多的相同值处于相同的位置

解题思路:

1. 并查集:使用并查集, 将allowedSwaps数组中的索引位置***建立连通分量***,在同一个分量里面的任意两个索引位置可以***交换任意次***;
2. 使用mapSource记录source数组中的每个值出现的索引位置;
3. 遍历数组target,
	(1)当target[i]和source[i]值相同时, 将mapSource中, source[i]对应的i位置删除;
	(2)当target[i]和source[i]值不相同时:
		a) 当source数组中含有target[i]时:
			(a) 遍历List temp = mapSource.get([target[i]]), 找到temp中可交换的索引位置exchange = temp.get(j), 并记录当前temp中的索引位置j;
			(b) 交换source[i]和source[j]的值;
			(c) 删除source[i]在mapSource中的当前所以位置i;
			(d) 更新source[exchange]在mapsource中的位置, 将source[exchange]当前的i值更新为exchange;

JAVA 代码

      public int minimumHammingDistance(int[] source, int[] target, int[][] allowedSwaps) {
   
        //Map记录source中的每个值所在的索引位置, 这里有一点, 一个值是可以重复出现的
        Map<Integer,List> mapSource = new HashMap<>();
        for(int i=0;i<source.length;i++){
   
            if(mapSource.containsKey(source[i])){
   
                List<Integer> temp = new ArrayList<>(mapSource.get(source[i]));
                temp.add(i);
                mapSource.put(source[i], temp);
            }else 

你可能感兴趣的:(LC数据结构与算法题目)