2 Star 10 Fork 2

CG国斌 / myleetcode

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
克隆/下载
_547.java 2.67 KB
一键复制 编辑 原始数据 按行查看 历史
CG国斌 提交于 2020-02-16 12:49 . 新增字节跳动面试题
package com.hit.basmath.interview.top_interview_questions.hard_collection.trees_and_graphs;
import java.util.LinkedList;
import java.util.Queue;
/**
* 547. Friend Circles
* <p>
* There are N students in a class. Some of them are friends, while some are not. Their friendship is transitive in nature. For example, if A is a direct friend of B, and B is a direct friend of C, then A is an indirect friend of C. And we defined a friend circle is a group of students who are direct or indirect friends.
* <p>
* Given a N*N matrix M representing the friend relationship between students in the class. If M[i][j] = 1, then the ith and jth students are direct friends with each other, otherwise not. And you have to output the total number of friend circles among all the students.
* <p>
* Example 1:
* <p>
* Input:
* [[1,1,0],
* [1,1,0],
* [0,0,1]]
* <p>
* Output: 2
* <p>
* Explanation:The 0th and 1st students are direct friends, so they are in a friend circle.
* The 2nd student himself is in a friend circle. So return 2.
* <p>
* Example 2:
* <p>
* Input:
* [[1,1,0],
* [1,1,1],
* [0,1,1]]
* <p>
* Output: 1
* <p>
* Explanation:The 0th and 1st students are direct friends, the 1st and 2nd students are direct friends,
* so the 0th and 2nd students are indirect friends. All of them are in the same friend circle, so return 1.
* <p>
* Note:
* <p>
* 1. N is in range [1,200].
* 2. M[i][i] = 1 for all students.
* 3. If M[i][j] = 1, then M[j][i] = 1.
*/
public class _547 {
public int findCircleNum(int[][] M) {
int[] visited = new int[M.length];
int count = 0;
Queue<Integer> queue = new LinkedList<>();
for (int i = 0; i < M.length; i++) {
if (visited[i] == 0) {
queue.add(i);
while (!queue.isEmpty()) {
int s = queue.remove();
visited[s] = 1;
for (int j = 0; j < M.length; j++) {
if (M[s][j] == 1 && visited[j] == 0)
queue.add(j);
}
}
count++;
}
}
return count;
}
public int findCircleNum2(int[][] M) {
int[] visited = new int[M.length];
int count = 0;
for (int i = 0; i < M.length; i++) {
if (visited[i] == 0) {
dfs(M, visited, i);
count++;
}
}
return count;
}
private void dfs(int[][] M, int[] visited, int i) {
for (int j = 0; j < M.length; j++) {
if (M[i][j] == 1 && visited[j] == 0) {
visited[j] = 1;
dfs(M, visited, j);
}
}
}
}
Java
1
https://gitee.com/guobinhit/myleetcode.git
git@gitee.com:guobinhit/myleetcode.git
guobinhit
myleetcode
myleetcode
master

搜索帮助