class Solution {
public boolean canFinish(int numCourses, int[][] prerequisites) {
int n = prerequisites.length;
List<List<Integer>> nextNode = new ArrayList<>();
int[] nodeIn = new int[numCourses];
Queue<Integer> queue = new LinkedList<>();
//统计所有节点的入度以及所有节点所对应的下一个节点
for(int i = 0;i < numCourses;i++){
nextNode.add(new ArrayList<>());
}
for(int i = 0;i < n;i++){
int outt = prerequisites[i][0],inn = prerequisites[i][1];
List<Integer> origin = nextNode.get(outt);
origin.add(inn);
nextNode.set(outt,origin);
nodeIn[inn]++;
}
//将入度为0的节点入队列
for(int i = 0;i < numCourses;i++){
if(nodeIn[i] == 0)
queue.add(i);
}
int visited = 0;
while(!queue.isEmpty()){
int node = queue.poll();
List<Integer> nextList = nextNode.get(node);
visited++;
//将节点的下一个节点对应的入度-1,若入度为0,则入队
for(int i = 0;i < nextList.size();i++){
int nextOfNode = nextList.get(i);
nodeIn[nextOfNode]--;
if(nodeIn[nextOfNode] == 0){;
queue.add(nextOfNode);
}
}
}
return visited >= numCourses;
}
}
leetcode207. 课程表
最新推荐文章于 2024-06-01 18:05:44 发布