leetcode207 课程表(拓扑排序)

发布时间 2023-07-05 11:58:32作者: huangs154
public boolean canFinish(int numCourses, int[][] prerequisites) {
//每个点的入度
int[] d = new int[numCourses];
//邻接表定义
ArrayList<ArrayList<Integer>> list = new ArrayList<>();
for (int i = 0; i < numCourses; i++) {
list.add(new ArrayList<>());
}
//创建连接表
for (int[] nums : prerequisites) {
list.get(nums[1]).add(nums[0]);
d[nums[0]]++;
}
//记录入队点数
int ans = 0;
ArrayDeque<Integer> queue = new ArrayDeque<>();
for (int i = 0; i < numCourses; i++) {
if (d[i] == 0) {
queue.add(i);
ans++;
}
}
while (!queue.isEmpty()) {
Integer poll = queue.poll();
for (int j = 0; j < list.get(poll).size(); j++) {
d[list.get(poll).get(j)]--;
if (d[list.get(poll).get(j)] == 0) {
queue.add(list.get(poll).get(j));
ans++;
}
}
}

if (ans == numCourses) {
return true;
}
return false;
}