leetcode-朋友圈

解析

方法一:DFS

遍歷所有人,對(duì)于每一個(gè)人,尋找他的好友,找到好友后再找這個(gè)好友的好友,這樣深度優(yōu)先遍歷下去,設(shè)置一個(gè)visited記錄是否已經(jīng)遍歷了這個(gè)人。 因?yàn)槿绻鹠個(gè)人最多m個(gè)朋友圈,設(shè)置后visited后,相同的朋友圈會(huì)檢測(cè)到visited[i]!=0就會(huì)不算數(shù)

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) {
               //沒(méi)有訪問(wèn)到,就把當(dāng)前的組+1,并把可以包含在朋友圈的所有的有關(guān)系的好友標(biāo)記出來(lái)
                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);//在去找這個(gè)好友的好友
            }
             
        }
    }
}

方法二: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++) {
                // 未被訪問(wèn)過(guò)且是鄰接點(diǎn),注意是node的鄰接點(diǎn)
                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屬于哪一個(gè)組,如果不是自成一組,在往下找pre[x]屬于哪個(gè)組
        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;//先各自為組,組名也為自己的序號(hào)
        int group = M.length;//一開(kāi)始有多少人就有多少個(gè)朋友圈,當(dāng)每出現(xiàn)一對(duì)朋友時(shí)就減1,最后就是總的朋友圈數(shù)量了。
        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){
                        //如果不屬于同個(gè)朋友圈的話就把i歸為j的組
                        pre[x1] = x2;
                        group--;
                    }
                }
            }
        }
        return group;
    }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 朋友圈 題目敘述: 班上有 N 名學(xué)生。其中有些人是朋友,有些則不是。他們的友誼具有是傳遞性。如果已知 A 是 B...
    一萍之春閱讀 1,769評(píng)論 0 2
  • 更多干貨就在我的個(gè)人博客 BlackBlog.tech 歡迎關(guān)注!也可以關(guān)注我的csdn博客:黑哥的博客謝謝大家!...
    BlackBlog__閱讀 2,674評(píng)論 0 6
  • 一、動(dòng)態(tài)規(guī)劃 找到兩點(diǎn)間的最短路徑,找最匹配一組點(diǎn)的線,等等,都可能會(huì)用動(dòng)態(tài)規(guī)劃來(lái)解決。 參考如何理解動(dòng)態(tài)規(guī)劃中,...
    小碧小琳閱讀 25,673評(píng)論 2 20
  • 如題,春節(jié)前幾天做夢(mèng),夢(mèng)到母親一夜變老,全部白頭。夢(mèng)里床上的媽媽面露驚恐,手插進(jìn)自己的白發(fā),凄厲的聲音回響...
    阿尤衛(wèi)閱讀 426評(píng)論 0 2
  • 正如我們注意到的,所有一切都是自然的,盡管不是特別高貴或有道德的,甚至在某些情況下不是事實(shí)——只是自然。這一趨勢(shì)可...
    張?zhí)硌?/span>閱讀 279評(píng)論 0 0

友情鏈接更多精彩內(nèi)容