LeetCode 547
Friend Circles
- Problem Description:
题目给出一个0-1矩阵,M[i][j]=1表示i和j是直接朋友关系,要求遍历整个矩阵返回朋友圈的数量。朋友圈的定义包括直接朋友和间接朋友,如M[i][j]=1, M[j][k]=1,则i和k也是朋友(通过j认识的)。
具体的题目信息:
https://leetcode.com/problems/friend-circles/description/
- Example:
- Solution:
- 解题思路:用队列存储每个人的直接朋友,然后访问队列中每个人(每访问一次,队首元素出队),获取其直接朋友并入列,直至队列为空,这就形成一个朋友圈。对矩阵中的每一行重复此操作即可,注意在访问后将矩阵中对应位置值设为0防止重复访问陷入循环。
- 编程实现:
class Solution {
public:
int findCircleNum(vector<vector<int>>& M) {
if (M.size() == 0) return 0;
queue<pair<int, int>> Q;
int num = 0;
for (int i = 0; i < M.size(); i++) {
for (int j = 0; j < M.size(); j++) {
if (M[i][j]) {
M[i][j] = 0;
Q.push({i, j});
}
}
if(!Q.empty()) num++;
while(!Q.empty()) {
pair<int, int> t = Q.front();
Q.pop();
for (int k = 0; k < M.size(); k++)
MM(M, t.second, k, Q);
}
}
return num;
}
void MM(vector<vector<int>>& M, int i, int j, queue<pair<int, int>>& Q) {
if (i >= 0 && i < M.size() && j>=0 && j < M.size()&& M[i][j]) {
M[i][j] = 0;
Q.push({i, j});
}
return;
}
};