• 剑指Offer || 116.省份数量


    题目

    有 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]

    注意:本题与主站 547 题相同: 力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台

    LCR 116. 省份数量 - 力扣(LeetCode)

    题解

    思路一:dfs,挨个结点进行深搜,每有一个新的城市没有被visited,province++。

    代码:

    1. class Solution {
    2. public int findCircleNum(int[][] isConnected) {
    3. boolean[] visited=new boolean[isConnected.length];
    4. int province=0;
    5. for(int i=0;i
    6. if(!visited[i]) {
    7. dfs(isConnected,visited,i);
    8. province++;
    9. }
    10. }
    11. return province;
    12. }
    13. public void dfs(int[][] isConnected,boolean[] visited,int i){
    14. for(int j=0;j
    15. if(isConnected[i][j]==1&&!visited[j]) {
    16. visited[j]=true;
    17. dfs(isConnected,visited,j);
    18. }
    19. }
    20. }
    21. }

    思路二:并查集,find找当前结点的根节点,union来合并两个不同根的结点。注意合并时一定要合并当前结点的根节点而不是当前结点。

    代码:

    1. class Solution {
    2. public int findCircleNum(int[][] isConnected) {
    3. int n=isConnected.length;
    4. int[] parent=new int[n];
    5. for(int i=0;i
    6. parent[i]=-1;
    7. for (int i = 0; i
    8. for (int j = i + 1; j
    9. if (isConnected[i][j] == 1)
    10. union(parent, i, j);
    11. }
    12. }
    13. int province=0;
    14. for(int i=0;i
    15. if(parent[i]==-1) province++;
    16. return province;
    17. }
    18. public int find(int[] parent,int x) {
    19. while(parent[x]>=0) x=parent[x];
    20. return x;
    21. }
    22. public void union(int[] parent,int x1,int x2) {
    23. int root1=find(parent,x1);
    24. int root2=find(parent,x2);
    25. if(root1==root2) return;
    26. parent[root2]=root1;
    27. }
    28. }

  • 相关阅读:
    [PAT练级笔记] 10 Basic Level 1012
    边缘计算发生了什么?
    java毕业设计Web产品管理系统源码+系统+数据库+lw文档+调试运行
    2022/7/31
    ChromeOptions 设置WebDriver/ChromeDriver的请求头参数
    请求头Authorization
    再见,Ubuntu,你好,Manjaro
    【王道】数据结构与算法之排序算法(十一)
    郁金香2021年游戏辅助技术中级班(七)
    Linux下 gdb调试打印数组元素说明
  • 原文地址:https://blog.csdn.net/Mar_mxs/article/details/134469320