【LeetCode:765. 情侣牵手 | 并查集】

在这里插入图片描述

算法题

算法刷题专栏 | 面试必备算法 | 面试高频算法
越难的东西,越要努力坚持,因为它具有很高的价值,算法就是这样✨
作者简介:硕风和炜,CSDN-Java领域新星创作者,保研|国家奖学金|高中学习JAVA|大学完善JAVA开发技术栈|面试刷题|面经八股文|经验分享|好用的网站工具分享
恭喜你发现一枚宝藏博主,赶快收入囊中吧
人生如棋,我愿为卒,行动虽慢,可谁曾见我后退一步?

算法题

在这里插入图片描述
【LeetCode:765. 情侣牵手 | 并查集】_第1张图片

目录

    • 题目链接
    • ⛲ 题目描述
    • 求解思路&实现代码&运行结果
      • ⚡ 并查集
        • 求解思路
        • 实现代码
        • 运行结果
    • 共勉

题目链接

  • 765. 情侣牵手

⛲ 题目描述

n 对情侣坐在连续排列的 2n 个座位上,想要牵到对方的手。

人和座位由一个整数数组 row 表示,其中 row[i] 是坐在第 i 个座位上的人的 ID。情侣们按顺序编号,第一对是 (0, 1),第二对是 (2, 3),以此类推,最后一对是 (2n-2, 2n-1)。

返回 最少交换座位的次数,以便每对情侣可以并肩坐在一起。 每次交换可选择任意两人,让他们站起来交换座位。

示例 1:

输入: row = [0,2,1,3]
输出: 1
解释: 只需要交换row[1]和row[2]的位置即可。
示例 2:

输入: row = [3,2,0,1]
输出: 0
解释: 无需交换座位,所有的情侣都已经可以手牵手了。

提示:

2n == row.length
2 <= n <= 30
n 是偶数
0 <= row[i] < 2n
row 中所有元素均无重复

求解思路&实现代码&运行结果


⚡ 并查集

求解思路
  1. 首先,我们先把一对情侣看成一个整体。
  2. 接下来,我们来看一下情侣坐错的情况,如果是俩对情侣坐错,那么至少需要交换一次;如果是三对情侣坐错,那么至少需要交换二次;如果是四对情侣坐错,那么至少需要交换三次,依次类推。那我们现在只需要求解的是共有多少对情侣坐错,减1便可以得到最少的交换次数。
  3. 怎么知道有多少对情侣坐错了吗?我们可以通过并查集算法来求解。
  4. 但是需要注意的是,因为我们需要把一对情侣看成是一对,怎么通过代码实现呢?由于 0和1配对、2和3配对 … 因此互为情侣的两个编号除以 2 对应同一个数字,认为他们是一对情侣。
  5. 具体实现代码如下所示:
实现代码
public class Solution {

    public int minSwapsCouples(int[] row) {
        int len = row.length;
        int N = len / 2;
        UnionFind unionFind = new UnionFind(N);
        for (int i = 0; i < len; i += 2) {
            unionFind.union(row[i] / 2, row[i + 1] / 2);
        }
        return N - unionFind.getCount();
    }

    private class UnionFind {

        private int[] parent;

        private int count;

        public int getCount() {
            return count;
        }

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

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

        public void union(int x, int y) {
            int rootX = find(x);
            int rootY = find(y);
            if (rootX == rootY) {
                return;
            }
            parent[rootX] = rootY;
            count--;
        }
    }
}
运行结果

【LeetCode:765. 情侣牵手 | 并查集】_第2张图片


共勉

最后,我想和大家分享一句一直激励我的座右铭,希望可以与大家共勉!

在这里插入图片描述

你可能感兴趣的:(LeetCode每日一题打卡,leetcode,算法,java,并查集,数据结构)