题意:
0 到n-1,n门课程,给定一系列的 [ x , y ],代表x的先修课程是y,即必须先修y,判断学生能否修完所有课程。
分析:
其实就是判断死锁。a锁住了b,b锁住了c,c锁住了d,d锁住了a就不行,很容易就推出,判断有没有圈。
本来设置start, end 动态改变,实现后发现不行,因为有些数据之间的课程值能相等。
这个方法不行的话,就用笨办法,动态的去除可以解开的结点加上的所有锁(可以解开意味着没有被加锁)。如果一个节点被动态的解锁,直到没有被锁了,就又可以去解别的锁,最后看是否全部解锁。用队列模拟这个动态的过程:
public class Solution {
public boolean canFinish(int numCourses, int[][] prerequisites) {
int[] locked = new int[numCourses];
int count = 0;
for(int[] prerequisite : prerequisites){
locked[prerequisite[0]]++; //每个结点被加了几个锁
}
Queue<Integer> q = new LinkedList<>();
for(int i=0; i<locked.length; i++){
if(locked[i] == 0){
q.offer(i);
count++;
}
}
while(!q.isEmpty()){
int lesson = q.poll();
for(int[] prerequisite : prerequisites){
if(prerequisite[1] == lesson){
locked[prerequisite[0]]--;
if(locked[prerequisite[0]] == 0){
q.offer(prerequisite[0]);
count++;
}
}
}
}
return count == numCourses;
}
}