刷题日记:课程表II

该文章提供了一个解决LeetCode第210题的算法,通过拓扑排序的方法安排课程顺序。使用宽度优先搜索(BFS)策略,计算每个课程的入度并存储在数组中,然后构建有向图。从入度为0的课程开始遍历,不断更新节点的入度并将其加入结果数组,直到所有课程都被处理或无法继续拓扑排序。
摘要由CSDN通过智能技术生成
题目描述:

在这里插入图片描述

leetcode210.课程表

题解
/**
 * @param {number} numCourses
 * @param {number[][]} prerequisites
 * @return {number[]}
 */
var findOrder = function(numCourses, prerequisites) {
    // 求拓扑排序的思路(拓扑排序的概念自行去了解),本题和课程表方法一直,只是结果不用一个数字判断和numCourses是否相等,而是将数据保存在一个数组中。
    // 用宽度优先搜索,由于题目是用0到numCourses - 1表示每一课(即为有向图的一个节点);则用一个长度为numCourses的数组indeg来保存所有的入度,indeg数组的下标就是每课(即为有向图的一个节点),
    // 用edegs来表示保存有向图,有向图的数据接口,用对象表示,key是每一种课(即图里面的节点),对应的值是一个数组表示指向的课(及指向的节点)
    let indeg = Array(numCourses).fill(0) // 存入度
    let edegs = {}; // 存图
    let res = [] // 队列中的最终值,存放节点
    let queue = [] // 宽度搜索遍历队列
    for(let i = 0; i < prerequisites.length; i++){
        indeg[prerequisites[i][0]] += 1
        if(!edegs[prerequisites[i][1]]){
            edegs[prerequisites[i][1]] = []
        }
        edegs[prerequisites[i][1]].push(prerequisites[i][0])
    }
    for(let i = 0; i < indeg.length; i++){
        if(indeg[i] === 0){
            queue.push(i) // 找到入度为0的将其放入队列
        }
    }
    while(queue && queue.length !== 0){
        let u = queue.shift(); // 将入度为0的节点弹出 表示这个节点符合拓扑排序
        res.push(u)
        let edeg = edegs[u] // 找到所有以u为前导的节点集合
        if(edeg){ // 有可能不存在以u为前导的集合(u没有出度)
            for(let v of edeg){ // 这里的用的let ... of 注意一下
                indeg[v] -= 1
                if(indeg[v] === 0){ // 如果节点的入度为0 则入栈
                    queue.push(v)
                }
            }
        }

    }
    return res.length === numCourses ? res : []
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值