
java
class Solution {
public boolean canFinish(int numCourses, int[][] prerequisites) {
//记录入度
int[] inDegree = new int[numCourses];
//建立邻接表
List<List<Integer>> adjacencyList = new ArrayList<>();
for(int i = 0; i < numCourses; i++){
adjacencyList.add(new ArrayList<>());
}
//建图,pre[0]是想学的课,pre[1]是前置课
for(int[] pre : prerequisites){
int courseToTake = pre[0];
int prerequisite = pre[1];
inDegree[courseToTake]++;
//学完想学的课的前置课程,才能将想学的课加入到邻接表中相应位置
adjacencyList.get(prerequisite).add(courseToTake);
}
//将没有前置课程的课放入到队列中
Queue<Integer> queue = new LinkedList<>();
for(int i = 0; i < numCourses; i++){
if(inDegree[i] == 0){
queue.offer(i);
}
}
int finishedCourses = 0;
while(!queue.isEmpty()){
int currentCourse = queue.poll();
finishedCourses++;
//找到这门课程能解锁的后续课程
for(int nextCourse : adjacencyList.get(currentCourse)){
inDegree[nextCourse]--;
if(inDegree[nextCourse] == 0){
queue.offer(nextCourse);
}
}
}
return finishedCourses == numCourses;
}
}
解题思路:
建立邻接表
建图将课程的关系放入进邻接表中
将没有前置课程的课程放入进队列中
逻辑处理,找到当前课程的后续课程,将入度-1并进行判断,入度为0的时候,加入队列