207. Course Schedule
我们定义二维数组 graph 来表示这个有向图,一维数组 in 来表示每个顶点的入度。我们开始先根据输入来建立这个有向图,并将入度数组也初始化好。然后我们定义一个 queue 变量,将所有入度为0的点放入队列中,然后开始遍历队列,从 graph 里遍历其连接的点,每到达一个新节点,将其入度减一,如果此时该点入度为0,则放入队列末尾。直到遍历完队列中所有的值,若此时还有节点的入度不为0,则说明环存在,返回 false,反之则返回 true
inDegree[]: 修该门课程的入度,即先修课数量;
class Solution { public boolean canFinish(int numCourses, int[][] prerequisites) { int[] inDegree = new int[numCourses]; Map<Integer, List<Integer>> graph = new HashMap<>(); //Graph: key->课程 value->所需先修课列表 //inDegree[] 下标对应课程,value为对应的入度 for(int i = 0; i < prerequisites.length; i++){ inDegree[prerequisites[i][0]]++; if(graph.containsKey(prerequisites[i][1])){ graph.get(prerequisites[i][1]).add(prerequisites[i][0]); }else{ ArrayList<Integer> list = new ArrayList<>(); list.add(prerequisites[i][0]); graph.put(prerequisites[i][1], list); } } Queue<Integer> queue = new LinkedList<>(); for(int i = 0; i < numCourses; i++){ if(inDegree[i] == 0) queue.add(i); } while(!queue.isEmpty()){ int cur = queue.poll(); List<Integer> toTake = graph.get(cur); for(int i = 0; toTake != null && i < toTake.size(); i++){ inDegree[toTake.get(i)]--; if(inDegree[toTake.get(i)] == 0) queue.add(toTake.get(i)); } } for(int i = 0; i <numCourses; i++){ if(inDegree[i] != 0) return false; } return true; } }
210. Course Schedule II
用Order[]来存储路线
class Solution { public int[] findOrder(int numCourses, int[][] prerequisites) { if(numCourses == 0) return null; int inDegree[] = new int[numCourses], order[] = new int[numCourses], index = 0; for(int i = 0; i < prerequisites.length; i++){ inDegree[prerequisites[i][0]]++; } Queue<Integer> queue = new LinkedList<Integer>(); for(int i = 0; i < numCourses; i++){ if(inDegree[i] == 0){ order[index++] = i; queue.offer(i); } } while(!queue.isEmpty()){ int cur = queue.poll(); for(int i = 0; i < prerequisites.length; i++){ if(prerequisites[i][1] == cur){ inDegree[prerequisites[i][0]]--; if(inDegree[prerequisites[i][0]] == 0){ //If inDegree is zero, then add the course to the order order[index++] = prerequisites[i][0]; queue.offer(prerequisites[i][0]); } } } } return (index == numCourses) ? order : new int[0]; } }