当前位置:   article > 正文

LeetCode:547. 省份数量(并查集 Java)

LeetCode:547. 省份数量(并查集 Java)

目录

547. 省份数量

题目描述:

实现代码与解析:

原理思路:


547. 省份数量

题目描述:

        有 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] 为 1 或 0
  • isConnected[i][i] == 1
  • isConnected[i][j] == isConnected[j][i]

实现代码与解析:

  1. import java.util.HashSet;
  2. import java.util.Set;
  3. class Solution {
  4. int[] p = new int[210];
  5. public int find(int x) {
  6. if (p[x] != x) p[x] = find(p[x]);
  7. return p[x];
  8. }
  9. public int findCircleNum(int[][] isConnected) {
  10. int n = isConnected.length;
  11. int m = isConnected[0].length;
  12. // 初始化
  13. for (int i = 0; i < p.length; i++) {
  14. p[i] = i;
  15. }
  16. for (int i = 0; i < n; i++) {
  17. for (int j = 0; j < m; j++) {
  18. if (isConnected[i][j] == 1 && i != j) {
  19. p[find(i)] = find(j);
  20. }
  21. }
  22. }
  23. HashSet<Integer> set = new HashSet<>();
  24. for (int i = 0; i < n; i++) {
  25. set.add(find(i));
  26. }
  27. return set.size();
  28. }
  29. }

原理思路:

        简单的利用并查集而已。

原理请看我之前写的并查集详解。

        Leetcode:684. 冗余连接(并查集C++)_树可以看成是一个连通且无环的无向图。 给定往一棵 n 个节点 (节点值 1~n) 的树-CSDN博客

        然后注意这题,求的返回求根的种类即可,我这里用的set去重。over。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/weixin_40725706/article/detail/531711
推荐阅读
相关标签
  

闽ICP备14008679号