/* * 210 Course ScheduleII * 2016-6-9 by Mingyang * http://www.jyuan92.com/blog/leetcode-course-schedule-ii/ * 在明白了I以后我们做II就很简单了,从最后的节点一个一个的放入queue里面,然后分别记录下来 * 不过有以下几个注意点: * 1.不用开始判断空了 * 2.最后的判断很重要,如果numOfPreCourse == numCourses就表示我们有这么一个完成的课程 * 我们就返回res,不然就返回空的array */ public int[] findOrder(int numCourses, int[][] prerequisites) { int[] res = new int[numCourses];//区别1,多了一个装order的array int[] preCourses = new int[numCourses]; // store the in-degree # for (int[] prerequisite : prerequisites) { preCourses[prerequisite[0]]++; } Queue<Integer> queue = new LinkedList<Integer>(); for (int i = 0; i < preCourses.length; i++) { if (preCourses[i] == 0) {//这里是从下往上走,从最低级的课往高级的课走 queue.add(i); } } int numOfPreCourse = 0; int i = 0;//区别2,多了一个i来遍历res while (!queue.isEmpty()) { int top = queue.poll(); res[i++] = top; numOfPreCourse++; for (int[] prerequisite : prerequisites) { if (prerequisite[1] == top) { preCourses[prerequisite[0]]--; if (preCourses[prerequisite[0]] == 0) { queue.add(prerequisite[0]); } } } }//最后再多一个判断,就是返回是否是需要return新的 if (numOfPreCourse == numCourses) { return res; } else { return new int[0]; } }