【LeetCode Practice】[Medium]547. Number of Provinces

【LeetCode Practice】[Medium]547. Number of Provinces

547. Number of Provinces

547. Number of Provinces

Algorithm idea: array

topic:

Insert picture description here
It is equivalent to finding how many connected components in this graph, you can use DFS, BFS, and check the set.
Record DFS BFS as follows

java code-DFS

class Solution {
    
    
     public int findCircleNum(int[][] isConnected) {
    
    
        int num = isConnected.length;
        int count = 0;
        boolean[] visit = new boolean[num];//用来标记节点是否访问过
        for (int i = 0; i < num; i++) {
    
    
            if (!visit[i]) {
    
    
                visit[i] = true;//标记当前节点访问过
                myDfs(isConnected, visit, num, i);//DFS向下查找一次,则连通分量加一
                count++;//连通分量加一
            }
        }
        return count;
    }

    private void myDfs(int[][] isConnected, boolean[] visit, int num, int node) {
    
    
        for (int i = 0; i < num; i++) {
    
    //查找相邻节点,是否能到达
            if (!visit[i] && isConnected[node][i] == 1) {
    
    //如果相邻能连通
                visit[i] = true;//标记当前节点访问过
                myDfs(isConnected, visit,num, i);//用相邻节点,向下递归
            }
        }
    }
}

java code-BFS

class Solution {
    
    
     public int findCircleNum(int[][] isConnected) {
    
    
        int num = isConnected.length;
        int count = 0;
        boolean[] visit = new boolean[num];
        Queue<Integer> queue = new LinkedList<>();
        //开始遍历
        for (int i =0 ; i < num; i++){
    
    
            if(!visit[i]){
    
    
                queue.offer(i);
                visit[i] = true;
                while (!queue.isEmpty()) {
    
    
                    int node = queue.poll();
                    for (int j =0 ; j < num; j++){
    
    
                        if(!visit[j] && isConnected[node][j] == 1){
    
    
                            queue.offer(j);
                            visit[j] = true;
                        }
                    }
                }
                count++;
            }
        }
        return count;
    }
}

java code-and check set

class Solution {
    
    
    public int findCircleNum(int[][] isConnected) {
    
    
        int provinces = isConnected.length;
        int[] parent = new int[provinces];
        for (int i = 0; i < provinces; i++) {
    
    
            parent[i] = i;
        }
        for (int i = 0; i < provinces; i++) {
    
    
            for (int j = i + 1; j < provinces; j++) {
    
    
                if (isConnected[i][j] == 1) {
    
    
                    union(parent, i, j);
                }
            }
        }
        int circles = 0;
        for (int i = 0; i < provinces; i++) {
    
    
            if (parent[i] == i) {
    
    
                circles++;
            }
        }
        return circles;
    }

    public void union(int[] parent, int index1, int index2) {
    
    
        parent[find(parent, index1)] = find(parent, index2);
    }

    public int find(int[] parent, int index) {
    
    
        if (parent[index] != index) {
    
    
            parent[index] = find(parent, parent[index]);
        }
        return parent[index];
    }
}

Guess you like

Origin blog.csdn.net/qq_39457586/article/details/114694952