并查集(超级简单直观)按秩合并,路径压缩

本文介绍了并查集的概念,通过路径压缩和按秩合并优化算法,提升查询效率。详细讲解了如何构建顶点上级数组,并提供了完整的Java代码实现。通过实例分析了并查集在解决LeetCode问题中的应用,帮助理解并查集的基本操作和优化技巧。
摘要由CSDN通过智能技术生成

在这里插入图片描述
本文参考了大神文章https://blog.csdn.net/iteye_9214/article/details/82099516
应该这就是原创了,网上有很多人模仿着写。

leetcode上的这道题,是并查集最简单直观的使用。简单来说,在基于已经构建好的关系网,要直接判断A和B是否是好朋友很难,但是如果可以知道A和C是好朋友,B和C也是好朋友,那么A和B自然也是好朋友了。但是人多了怎么办呢。可以在每个朋友圈找出一个孩子王,那么只要知道两个人的孩子王是否一样就可以判断他们是否是好朋友。基于这个思路可以得出并查集的一般解题方法
并查集的题一般分两步走:

1.分析题目,得出顶点数

这里的顶点可能理解起来比较抽象,比如像这道题,N名学生就是N个顶点。

2.构建顶点上级数组
并不是所有孩子都和孩子王玩得好(直接认识),所以构建一个pre[N]数组。pre[i] 表示学生 i 的上级学生。一直顺着上级学生找就可以找到孩子王,i 是孩子王的条件就是pre[i] = i,即他的上级就是他自己。
那么,说到底,怎么构建pre数组呢。首先将pre数组初始化,令 pre[i] = i 。然后根据题目中给的顶点(学生)之间的关系构建。比如A认识B,就可以令pre[A] = B。其实 pre[B] =A 也可以,这只会影响朋友圈内部的结构,不会影响两个学生是否是朋友。

代码如下

public int findCircleNum(int[][] M) {
   
	int len = M.length;
	pre = new int[len];
	for (int i = 0; i < len; i++){
   
	    pre[i] = i;
	}
	int total = len; // 最开始每个同学都说个独立的个体,所以同学的个数就是朋友圈的个数。
	for (int i = 0; i < len; i++){
   
	    for (int j = i + 1; j < len; j++){
   
	        if (M[i][j] == 1){
    // 此时已知i࿰
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值