这题要使用BFS算法,BFS也就是广度优先搜索,DFS是深度优先搜索,BFS是一层一层走,DFS是一条路走到头
这张图展示的就是BFS算法
在这道题里,最重要的就是创建一个用来放每个节点入度个数的数组以及一个二维节点邻接表
数组用来记录当前节点的入度个数,入度个数为0的节点可以入队
那么像0,1,2这三个节点就能入队,入队后要出队,出队时我们需要在二维节点邻接表中找到这个节点对应的后续节点,并且对应的给该节点的入度数减1
并且我们需要维护一个记录数,最后没有节点能够入队且队列中没有数据时跳出循环
java
class Solution {
public boolean canFinish(int numCourses, int[][] prerequisites) {
// 记录每门课程的度数
int[] inDegree = new int[numCourses];
// 初始化邻接表
List<List<Integer>> adjList = new ArrayList<>();
for (int i = 0;i<numCourses;i++){
adjList.add(new ArrayList<>());
}
// 计算每门课程的入度,并构建邻接表
for(int[] prerequisite :prerequisites){
int course = prerequisite[0];
int preCourse = prerequisite[1];
//该门课程的入读数加一
inDegree[course]++;
//邻接表中加入邻接数据
adjList.get(preCourse).add(course);
}
//度数为0的课程先入队,因为本来就不需要先前课程
Queue<Integer> queue = new LinkedList<>();
for(int i = 0;i<numCourses;i++){
if(inDegree[i] == 0) {
queue.offer(i);
}
}
// 记录已完成的课程数
int count = 0;
//只要队列中还有度数为0的课程
while(!queue.isEmpty()){
int selectedCourse = queue.poll();
//统计个数加1
count++;
//完成更新.后续涉及此课程为前提课程的课程的度数减1
//先获取当前课程的后续课程列表
List<Integer> nextCourses = adjList.get(selectedCourse);
for(int nextCourse : nextCourses){
//后续课程的入度减1
inDegree[nextCourse]--;
//如果减到0了,入队
if(inDegree[nextCourse] == 0){
queue.offer(nextCourse);
}
}
}
return count == numCourses;
}
}