剑指 Offer II 113. 课程顺序

232 阅读1分钟

剑指 Offer II 113. 课程顺序

给定一个数组 prerequisites ,它的每一个元素 prerequisites[i] 表示两门课程之间的先修顺序。 例如 prerequisites[i] = [ai, bi] 表示想要学习课程 ai ,需要先完成课程 bi 

输入: numCourses = 4, prerequisites = [[1,0],[2,0],[3,1],[3,2]]
输出: [0,1,2,3] or [0,2,1,3]
解释: 总共有 4 门课程。要学习课程 3,你应该先完成课程 1 和课程 2。并且课程 1 和课程 2 都应该排在课程 0 之后。
 因此,一个正确的课程顺序是 [0,1,2,3] 。另一个正确的排序是 [0,2,1,3]
var findOrder = function (n, prerequisites) {
    var map = new Map();
    for (var i = 0; i < n; i++) {
        map.set(i, []);
    }
    var brr = new Array(n).fill(0);
    for (var arr of prerequisites) {
        map.get(arr[1]).push(arr[0])
        brr[arr[0]]++;
    }
    var stack = [];
    for (var i = 0; i < brr.length; i++) {
        if (brr[i] == 0) {
            stack.push(i);
        }
    }
    var res = [];
    while (stack.length) {
        var course = stack.shift();
        res.push(course);
        for (var j of map.get(course)) {
            brr[j]--;
            if (brr[j] == 0) {
                stack.push(j);
            }
        }
    }
    return res.length == n ? res : []
};