判断图中是否有环
判断图中是否有环
1. 有向图【BFS】
207. 课程表
用例:
[[1,4],[2,4],[3,1],[3,2]]
弹出1的时候,4的入度由 2 变成 1
当再弹出2的时候,4的入度由 1 变成0,此时可以入队!!!
class Solution {
Deque<Integer> deque = new ArrayDeque<>();
Map<Integer, List<Integer>> map = new HashMap<>();
int[] inNum;
int count = 0; // 入度为0 的个数
public boolean canFinish(int numCourses, int[][] prerequisites) {
Set<Integer> set = new HashSet<>();
for (int[] prerequisite : prerequisites) {
int start = prerequisite[0];
int end = prerequisite[1];
set.add(start);
set.add(end);
List<Integer> orDefault = map.getOrDefault(start, new ArrayList<>());
orDefault.add(end);
map.put(start, orDefault); // 1. 邻接表
}
inNum = new int[numCourses];
for (int[] prerequisite : prerequisites) {
inNum[prerequisite[1]]++; // 2. 计算入度
}
for (int i = 0; i < inNum.length; i++) {
if (inNum[i] == 0 && map.containsKey(i)){ // 邻接表中入度为 0 的入队
deque.offer(i);
}
}
bfs();
return count == set.size(); // 入度为 0 的个数 == 节点的个数
}
public void bfs(){
while (!deque.isEmpty()){
int len = deque.size();
while (len > 0){
Integer peek = deque.poll();
count++;
List<Integer> list = map.getOrDefault(peek, new ArrayList<>());
for (Integer integer : list) {
inNum[integer]--;
if (inNum[integer] == 0){
deque.offer(integer);
}
}
len--;
}
}
}
}
2. 无向图【并查集 union find】
547. 省份数量
class Solution {
int[] arr;
int size;
public int findCircleNum(int[][] isConnected) {
int n = isConnected.length;
size = n;
arr = new int[n];
for (int i = 0; i < n; i++) {
arr[i] = i;
}
for (int i = 0; i < n; i++) {
for (int j = i + 1; j < n; j++) { // 只考虑上半三角即可!!!
if (isConnected[i][j] == 1){
union(i, j);
}
}
}
return size;
}
public int find(int x){
if (x == arr[x]){
return x;
}
return find(arr[x]);
}
public void union(int i, int j){
int f1 = find(i);
int f2 = find(j);
if (f1 != f2){
size--; // 能连 ===> 干掉一个省份!!!
arr[f2] = f1;
}
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix