输入的先决条件是由边缘列表表示的图形,而不是邻接矩阵。详情请参见图的表示法。
有想到用图,图还没细看过,正好看看。
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]; } }
[LeetCode] 210. 课程表 II !!!!(图)
原文:https://www.cnblogs.com/doyi111/p/12913683.html