刷题笔记d1

62 阅读1分钟

lc547:省份数量

image.png 题目解读
①n个城市,矩阵中隐含了城市数量,换句话说就是矩阵给出了城市数量以及连接关系
②题目抽象为有多少个直接或者间接可达的关系

思路
类似树的遍历,深度优先遍历或者广度优先遍历,但是要注意标记哪些城市是已经访问过的,避免重复访问,可以使用标记数组进行标记。
深度优先解法的解析: 当发现当前城市未被访问过时,以其作为起点进行深度遍历。 并且需要查看城市i与哪些城市相连时,只需要查看矩阵中第i行(第i列一样矩阵是对称的)中哪一些为1即可,所以只需要遍历该行即可

具体代码:

    public int findCircleNum(int[][] isConnected) {
        int cities = isConnected.length;
        boolean[] seen = new boolean[cities];
        int res = 0;
        for(int i=0;i<cities;i++){
        //作为起点
            if(!seen[i]){
                dfs(isConnected,seen,cities,i);
                res++;
            }
        }
        return res;
    }
    public void dfs(int[][] isConnected,boolean[] seen,int cities,int i){
    //遍历对应的行
        for(int j= 0;j<cities;j++){
            if(isConnected[i][j]==1&&!seen[j]){
                seen[j]=true;
                //深度遍历,同样是调用dfs去遍历对应的行
                dfs(isConnected,seen,cities,j);
            }
        }
    }