LeetCode 547. 朋友圈數量--無向連通圖
阿新 • • 發佈:2018-11-08
解析
方法一:DFS
遍歷所有人,對於每一個人,尋找他的好友,找到好友後再找這個好友的好友,這樣深度優先遍歷下去,設定一個visited記錄是否已經遍歷了這個人。 因為如果m個人最多m個朋友圈,設定後visited後,相同的朋友圈會檢測到visited[i]!=0就會不算數
class Solution { public int findCircleNum(int[][] M) { int res = 0; int[] visited = new int[M.length]; for (int i = 0; i < M.length; i++) { if (visited[i] == 0) { //沒有訪問到,就把當前的組+1,並把可以包含在朋友圈的所有的有關係的好友標記出來 res++; dfs(M, visited, i); } } return res; } private void dfs(int[][] M, int[] visited, int i) { visited[i] = 1; for (int j = 0; j < M.length; j++) { if (M[i][j] == 1 && visited[j] == 0) { dfs(M, visited, j);//在去找這個好友的好友 } } } }
方法二:BFS
import java.util.LinkedList; import java.util.Queue; class Solution { Queue<Integer> q = new LinkedList<>(); public void bfs(int[][] M, int[] visited, int i) { q.offer(i); visited[i] = 1; while (!q.isEmpty()) { int node = q.poll(); for (int j = 0; j < M.length; j++) { // 未被訪問過且是鄰接點,注意是node的鄰接點 if (visited[j] == 0 && M[node][j] == 1) { // visit[j]; q.offer(j); visited[j] = 1; } } } } public int findCircleNum(int[][] M) { int[] visited = new int[M.length]; int count = 0; for (int i = 0; i < M.length; i++) { if (visited[i] == 0) { bfs(M, visited, i); count++; } } return count; } }
方法三:並查集
class Solution { private int find(int x, int [] pre){////找到x屬於哪一個組,如果不是自成一組,在往下找pre[x]屬於哪個組 return pre[x]==x ? x : find(pre[x], pre); } public int findCircleNum(int[][] M) { if (M.length==0)return 0; int pre[]=new int[M.length]; for(int i=0; i<M.length; i++) pre[i] = i;//先各自為組,組名也為自己的序號 int group = M.length;//一開始有多少人就有多少個朋友圈,當每出現一對朋友時就減1,最後就是總的朋友圈數量了。 for(int i=0; i<M.length; i++){ for(int j=0; j<M.length; j++){ if (i != j && M[i][j] == 1){ int x1 = find(i, pre);//x1為i所屬的組 int x2 = find(j, pre);//x2為j所屬的組 if (x1 != x2){ //如果不屬於同個朋友圈的話就把i歸為j的組 pre[x1] = x2; group--; } } } } return group; } }