[LeetCode] 210. 课程表 II !!!!(图)

输入的先决条件是由边缘列表表示的图形,而不是邻接矩阵。详情请参见图的表示法

有想到用图,图还没细看过,正好看看。

拓扑排序思路一步步形成,类BFS

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];
    
    }
}

 

 

猜你喜欢

转载自www.cnblogs.com/doyi111/p/12913683.html