思路源自
【大厂程序员带你刷力扣】【LeetCode 207】课程表|拓扑排序|BFS
这种先后顺序问题采用有向图存储,统计每个顶点的入度情况,然后采用拓扑排序算法看看是否能让所有顶点的入度全部为0,如果可以那么拓扑成功
class Solution {
public boolean canFinish(int numCourses, int[][] prerequisites) {
Map<Integer, ArrayList<Integer>> graph = new HashMap<>();//图存储
int[] ingrees = new int[numCourses];//存储顶点入度情况
//创建图和顶点入度情况
for (int i = 0; i < numCourses; i++) {
graph.put(i, new ArrayList<>());
}
for (int[] prerequisite : prerequisites) {
int key = prerequisite[0];
int value = prerequisite[1];
ingrees[value]++;
graph.get(key).add(value);
}
int count=0;//统计入度为0的个数
Queue<Integer> queue = new LinkedList<>();
for (int i = 0; i < ingrees.length; i++) {
if (ingrees[i] == 0) {
queue.offer(i);
count++;
}
}
while (!queue.isEmpty()) {
Integer key = queue.poll();
ArrayList<Integer> list = graph.get(key);
for (Integer vertex : list) {
ingrees[vertex]--;
if (ingrees[vertex] == 0) {
count++;
queue.offer(vertex);
}
}
}
return numCourses == count;
}
}