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

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

 

 

 

 

 

posted @ 2020-05-18 23:08  doyi  阅读(341)  评论(0编辑  收藏  举报