[LeetCode] 210. 课程表 II !!!!(图)
输入的先决条件是由边缘列表表示的图形,而不是邻接矩阵。详情请参见图的表示法。
有想到用图,图还没细看过,正好看看。
class Solution { public int[] findOrder(int numCourses, int[][] prerequisites) { int[] inDegree = new int[numCourses]; HashMap<Integer, List<Integer>> map = new HashMap<>(); Queue<Integer> queue = new LinkedList<>(); for (int i = 0; i < prerequisites.length; i++) { inDegree[prerequisites[i][0]]++; if(map.containsKey(prerequisites[i][1])){ map.get(prerequisites[i][1]).add(prerequisites[i][0]); } else { List<Integer> list = new ArrayList<>(); list.add(prerequisites[i][0]); map.put(prerequisites[i][1], list); } } //遍历,将index入队 List<Integer> res = new ArrayList<>(); for (int i = 0; i < numCourses; i++) { if(inDegree[i] == 0){ queue.offer(i); } } // 出队,查哈希表,将入度为零的入队 while (!queue.isEmpty()){ Integer cur = queue.poll(); res.add(cur); if(map.containsKey(cur) && map.get(cur).size() != 0){ for (Integer num : map.get(cur)) { inDegree[num]--; if(inDegree[num] == 0) queue.offer(num); } } } //使用list的流来转为int[]数组,也可以通过遍历一遍完成转换。 return res.size() == numCourses ? res.stream().mapToInt(Integer::valueOf).toArray() : new int[0]; } }
=====================7.27======================
class Solution { public int[] findOrder(int numCourses, int[][] prerequisites) { if(numCourses==0) return new int[0]; int[] inDegrees = new int[numCourses]; for(int[] p:prerequisites){ inDegrees[p[0]]++; } Queue<Integer> queue = new LinkedList<>(); for(int i=0;i<inDegrees.length;i++){ if(inDegrees[i]==0) queue.offer(i); } int count=0; int[] res = new int[numCourses]; while(!queue.isEmpty()){ int curr = queue.poll(); res[count++]=curr; for(int[] p :prerequisites){ if(p[1]==curr){ inDegrees[p[0]]--; if(inDegrees[p[0]]==0){ queue.offer(p[0]); } } } } if(count==numCourses)return res; return new int[0]; } }