LeetCode——547 省份数量(JAVA)

n个城市,其中一些彼此相连,另一些没有相连。如果城市 a与城市 b直接相连,且城市 b与城市 c直接相连,那么城市 a与城市 c间接相连。

省份 是一组直接或间接相连的城市,组内不含其他没有相连的城市。

给你一个 n x n的矩阵 isConnected,其中 isConnected[i][j] = 1表示第 i个城市和第 j个城市直接相连,而 isConnected[i][j] = 0表示二者不直接相连。

返回矩阵中 省份 的数量。

示例 1:

在这里插入图片描述

输入:isConnected = [[1,1,0],[1,1,0],[0,0,1]]
输出:2

示例 2:

在这里插入图片描述

输入:isConnected = [[1,0,0],[0,1,0],[0,0,1]]
输出:3

提示:

  • 1 <= n<= 200
  • n== isConnected.length
  • n== isConnected[i].length
  • isConnected[i][j]10
  • isConnected[i][i] == 1
  • isConnected[i][j] == isConnected[j][i]

思路

并查集康复训练?(笑),其实这题就是个模板题。归纳一下并查集的主要函数:

  1. 寻找根结点findFather()(路径压缩可以写在这里);
  2. 合并两个集合Union()

关键数组:

  1. int[] father,用来记录某结点的父亲(father[x]表示x的父结点);
  2. boolean[] isRoot,用来记录所存储的集合数目(isRoot[x]表示x是否为集合中的根结点)。

代码

public class Solution {
	int[] father = new int[210];
	boolean[] isRoot = new boolean[210];
	public int findFather(int x) {
		int a = x;
		while(x!=father[x]) {
			x = father[x];
		}
		while(a!=father[a]) {
			int z = a;
			a = father[a];
			father[z] = x;
		}
		return x;
	}
	public void Union(int a, int b) {
		 int faA = findFather(a);
		 int faB = findFather(b);
		 if(faA!=faB) {
			 father[faA] = faB;
		 }
	}
	public int findCircleNum(int[][] isConnected) {
		for(int i=0;i<father.length;i++) {
			father[i] = i;
		}
		int rowSize = isConnected.length;
		int colSize = isConnected[0].length;
		for(int i=0;i<rowSize;i++) {
			for(int j=0;j<colSize;j++) {
				if(isConnected[i][j]==1) Union(i,j);
			}
		}
		for(int i=0;i<rowSize;i++) {
			isRoot[findFather(i)] = true;
		}
		int result = 0;
		for(boolean x : isRoot) {
			if(x==true) result++;
		}
		return result;
	}
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值