1. 程式人生 > 其它 >劍指Offer(專項突破版)---深度優先搜尋/廣度優先搜尋篇

劍指Offer(專項突破版)---深度優先搜尋/廣度優先搜尋篇

前言

來源:力扣(LeetCode)
著作權歸領釦網路所有。商業轉載請聯絡官方授權,非商業轉載請註明出處。

題解

116. 朋友圈 [n]

一個班上有 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]

DFS解法:

class Solution {
public:
    int findCircleNum(vector<vector<int>>& isConnected) {
        int num = isConnected.size();
        vector<bool> visited(num, false);
        int res = 0;
        for (int i = 0; i < num; i++) {
            if (!visited[i]) {
                dfs(isConnected, visited, num, i);
                res++;
            }
        }
        return res;
    }

    void dfs(const vector<vector<int>>& isConnected, vector<bool>& visited,
             int num, int curIdx) {
        for (int i = 0; i < num; i++) {
            if (isConnected[curIdx][i] && !visited[i]) {
                visited[i] = true;
                dfs(isConnected, visited, num, i);
            }
        }
    }
};

BFS解法:

class Solution {
public:
    int findCircleNum(vector<vector<int>>& isConnected) {
        int num = isConnected.size();
        vector<bool> visited(num, false);
        int res = 0;
        queue<int> q;
        for (int i = 0; i < num; i++) {
            if (!visited[i]) {
                q.push(i);
                while (!q.empty()) {
                    int curIdx = q.front();
                    q.pop();
                    for (int i = 0; i < num; i++) {
                        if (isConnected[curIdx][i] && !visited[i]) {
                            visited[i] = true;
                            q.push(i);
                        }
                    }
                }
                res++;
            }
        }
        return res;
    }
};