赞
踩
package com.heu.wsq.leetcode.bingchaji; import java.util.HashSet; import java.util.Set; /** * 547. 省份数量 * @author wsq * @date 2021/1/6 * 有 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 * * 链接:https://leetcode-cn.com/problems/number-of-provinces */ public class FindCircleNum { public int findCircleNum(int[][] isConnected){ int n = isConnected.length; UnionFind unionFind = new UnionFind(n); for (int i = 0; i < n; i++){ for (int j = i + 1; j < n; j++){ if (isConnected[i][j] == 1){ unionFind.union(i, j); } } } return unionFind.uNum(); } private class UnionFind{ private int[] parent; public UnionFind(int n){ this.parent = new int[n]; for (int i = 0; i < n; i++){ this.parent[i] = i; } } public void union(int x, int y){ int rootX = find(x); int rootY = find(y); if (rootX == rootY){ return; } parent[rootX] = rootY; } private int find(int x) { int r = x; while (r != parent[r]){ r = parent[r]; } int k = x; while (k != r){ int tmp = parent[k]; parent[k] = r; k = tmp; } return r; } public int uNum(){ int num = 0; for (int i = 0; i < parent.length; i++){ if (parent[i] == i){ num++; } } return num; } } }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。