思路:
i)先遍历一遍数组,把第二个元素的入度置为0存入新建的入度数组当中inDegree[]
ii)遍历一遍所有课程,如果入度为0,则存入队列中
iii)队列从前到后弹出元素,并加入数组res中记录已修的课程
搜寻数组中第二个元素是否与该弹出元素一致,一致则表明这是第一个元素的先修课程
将第一个元素的入度-1,判断若该元素的入度变为0了,则加入队列
代码:
class Solution {
public boolean canFinish(int numCourses, int[][] prerequisites) {
if(numCourses==0) return false;
//这里若数组为空,返回的是true而不是false
if(prerequisites.length==0) return true;
//这里不能写List,而是写成LinedList才能通过编译
LinkedList<Integer> queue=new LinkedList<>();
int[] inDegree=new int[numCourses];
//遍历所有节点,有入度的加度
for(int[] p:prerequisites){
inDegree[p[0]]++;
}
//遍历所有课程
for(int i=0;i<numCourses;i++){
if(inDegree[i]==0){
queue.addLast(i);
}
}
List<Integer> res=new ArrayList<>();
while(!queue.isEmpty()){
//这里出来的是Integer而不是int
Integer num=queue.removeFirst();
res.add(num);
//遍历所有临边
for(int[] p:prerequisites){
if(p[1]==num){
inDegree[p[0]]--;
if(inDegree[p[0]]==0){
queue.addLast(p[0]);
}
}
}
}
return res.size()==numCourses;
}
}
分解:
1)这里若数组为空,返回的是true而不是false
if(prerequisites.length==0) return true;
2)这里出来的是Integer而不是int
Integer num=queue.removeFirst();
3)核心代码
for(int[] p:prerequisites){
if(p[1]==num){
inDegree[p[0]]--;
if(inDegree[p[0]]==0){
queue.addLast(p[0]);
}
}
}
4)若res.size()==numCourses,表明已修完所有课程