面试算法113:课程顺序

这篇具有很好参考价值的文章主要介绍了面试算法113:课程顺序。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

题目

n门课程的编号为0~n-1。输入一个数组prerequisites,它的每个元素prerequisites[i]表示两门课程的先修顺序。如果prerequisites[i]=[ai,bi],那么必须先修完bi才能修ai。请根据总课程数n和表示先修顺序的prerequisites得出一个可行的修课序列。如果有多个可行的修课序列,则输出任意一个可行的序列;如果没有可行的修课序列,则输出空序列。
例如,总共有4门课程,先修顺序prerequisites为[[1,0],[2,0],[3,1],[3,2]],一个可行的修课序列是0→2→1→3。

分析

先根据先修顺序构建出有向图graph,graph用一个HashMap表示邻接表,它的键是先修课程,它的值是必须在键对应的课程之后学习的所有课程。同时,将每个节点的入度保存到数组inDegrees中,“inDegrees[i]”表示节点i的入度。
接下来用广度优先搜索算法实现拓扑排序。队列中保存的是入度为0的节点。每次从队列中取出一个节点,将该节点添加到拓扑排序序列中,然后找到该课程的后修课程并将它们的节点的入度减1,这相当于删除从先修课程到后修课程的边。如果发现新的入度为0的节点,则将其添加到队列中。重复这个过程直到队列为空,此时要么图中所有节点都已经访问完毕,已经得到了完整的拓扑排序序列;要么剩下的还没有搜索到的节点形成一个环,已经不存在入度为0的节点。文章来源地址https://www.toymoban.com/news/detail-792493.html

public class Test {
    public static void main(String[] args) {
        int[][] prerequisites = {{1, 0}, {2, 0}, {3, 1}, {3, 2}};
        int[] result = findOrder(4, prerequisites);
        for (int item : result) {
            System.out.println(item);
        }
    }

    public static int[] findOrder(int numCourses, int[][] prerequisites) {
        // graph用一个HashMap表示邻接表,它的键是先修课程,它的值是必须在键对应的课程之后学习的所有课程
        Map<Integer, List<Integer>> graph = new HashMap<>();
        for (int i = 0; i < numCourses; i++) {
            graph.put(i, new LinkedList<>());
        }

        // 表示节点i的入度
        int[] inDegrees = new int[numCourses];
        for (int[] prereq : prerequisites) {
            graph.get(prereq[1]).add(prereq[0]);
            inDegrees[prereq[0]]++;
        }

        Queue<Integer> queue = new LinkedList<>();
        for (int i = 0; i < numCourses; i++) {
            if (inDegrees[i] == 0) {
                queue.add(i);
            }
        }

        List<Integer> order = new LinkedList<>();
        while (!queue.isEmpty()) {
            int course = queue.remove();
            order.add(course);
            for (int next : graph.get(course)) {
                inDegrees[next]--;
                if (inDegrees[next] == 0) {
                    queue.add(next);
                }
            }
        }

        return order.size() == numCourses ? order.stream().mapToInt(i -> i).toArray() : new int[0];
    }

}

到了这里,关于面试算法113:课程顺序的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • [office] excel成绩表格数据排名次的教程 #职场发展#知识分享#媒体

    excel成绩表格数据排名次的教程 Excel 中经常需要使用到 排名 次的技巧,成绩表格数据具体该如何排名呢?接下来是小编为大家带来的excel成绩表格数据排名次的教程,供大家参考。 步骤1:不管在学校还是各个统计领域,排名应用随处可见,如果排序会打乱原有次序,那么好多

    2024年02月21日
    浏览(40)
  • 突破职场竞争,引领未来发展:考取《研发效能(DevOps)工程师职业技术认证》

    就业形势堪忧,什么最有保障?考个“国家级”证书傍身吧! 工信部教考中心作为中国领先的行业技能认证机构,其颁发的认证证书不仅代表了个人在信息技术领域的专业能力,更可以录入工业和信息化技术技能人才数据库,这是一个重要的信息资源平台,它可以帮助企业和

    2024年02月05日
    浏览(47)
  • [office] Excel中函数进行计算两个日期参数差值的方法 #职场发展#学习方法#媒体

    Excel中函数进行计算两个日期参数差值的方法 在excel使用中,如果想计算两个日期参数的差值,该用什么函数和如何使用呢?今天,小编就教大家在Excel中函数进行计算两个日期参数差值的方法。 Excel中函数进行计算两个日期参数差值的步骤 在excel中计算两个日期参数的差值,

    2024年02月20日
    浏览(49)
  • 从零学算法113

    113 .给你二叉树的根节点 root 和一个整数目标和 targetSum ,找出所有 从根节点到叶子节点 路径总和等于给定目标和的路径。 叶子节点 是指没有子节点的节点。 示例 1: 输入:root = [5,4,8,11,null,13,4,7,2,null,null,5,1], targetSum = 22 输出:[[5,4,11,2],[5,8,4,5]] 示例 2: 输入:root = [1,2,3]

    2024年02月11日
    浏览(36)
  • 【MATLAB源码-第113期】基于matlab的孔雀优化算法(POA)机器人栅格路径规划,输出做短路径图和适应度曲线。

    POA(孔雀优化算法)是一种基于孔雀羽毛开屏行为启发的优化算法。这种算法模仿孔雀通过展开其色彩斑斓的尾羽来吸引雌性的自然行为。在算法中,每个孔雀代表一个潜在的解决方案,而它们的尾羽开屏行为则被用来模拟解决方案的搜索和优化过程。 POA算法的核心思想是通

    2024年01月18日
    浏览(51)
  • AI绘画发展史(伪):从免费到吃屎;YSDA·自然语言处理课程8K Star;伯克利CS285·深度强化学习课程;前沿论文 | ShowMeAI资讯日报

    👀 日报合辑 | 📆 电子月刊 | 🔔 公众号下载资料 | 🍩 @韩信子 微博博主 @西仔LittileC 绘制了一份AI绘画发展史,展示了从业者的担忧——并非抗拒技术进步带来的竞争和压力,而是担心已有行业的种种乱象在绘画行业重演,最终导致所有用户被动『吃屎』。 大平台免费致使

    2024年02月12日
    浏览(55)
  • 【Go面试向】Go程序的执行顺序

    大家好 我是寸铁👊 总结了一篇Go程序的执行顺序的文章✨ 喜欢的小伙伴可以点点关注 💝 go程序通常包含: 包、常量、变量、init()、main()等元素 下面从这几个方面分别去梳理! 程序中的包 一个.go文件中,其他的包只有被 main 包import才会执行,按照import的 先后 顺序执行。

    2024年01月24日
    浏览(33)
  • java面试题全覆盖-顺序调整版

    基础部分 Java中基本数据类型有哪些? byte:8位,最大存储数据量是255,存放的数据范围是-128~127之间。 short:16位, int:32位,最大数据存储容量是2的32次方减1,数据范围是负的2的31次方到正的2的31次方减1。 long:64位,最大数据存储容量是2的64次方减1,数据范围为负的2的

    2024年02月08日
    浏览(48)
  • Kafka面试】Kafka如何保证消费的顺序性?

    消费者组的某个消费者可能负责消费 一个topic的多个分区 。每个分区都维护了偏移量(都是从0开始的),在消息存储时按照一定的策略来找到不同的分区进行存储,消费同样如此,并不能保证消息的顺序性。 要想保证顺序性,可以只提供一个分区,或者相同的业务只在一个

    2024年02月15日
    浏览(42)
  • 【kafka面试题2】如何保证kafka消息的顺序性

    如何保证kafka消息的顺序性呢,其实整体的策略就是:我们 让需要有序的消息发送到同一个分区Partition。 为什么说让有序的消息发送到同一个分区Partition就行呢,,下面我们来详细分析一下子。 首先 ,我们知道kafka消息的收发是基于Topic(主题),消息通过Topic进行分类。单

    2024年02月13日
    浏览(43)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包