劍指Offer(專項突破版)---深度優先搜尋/廣度優先搜尋篇
阿新 • • 發佈:2021-09-05
前言
來源:力扣(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; } };