Leetcode面试经典150题-210.课程表II

news2024/9/21 4:26:19

这个题是图的问题,因为图的拓扑排序在实际应用中有非常多的用途图,所以最近考的越来越多

解法都在代码里,不懂就留言或者私信

看这个题之前一定要好好看看207题我写的题解,也许207看懂了的话,210只是一个coding问题了

Leetcode面试经典150题-207.课程表-CSDN博客

一定要看!一定要看!一定要看!

class Solution {
    /**其实这个题一看就是第207题课程表的复杂版本,那么这个题和那个题有什么明显的不同呢,
    不同就是那个题问的是能不能完成,而这个题问的是按什么顺序完成,其实原理都是一样的
    我们只需要把过程中弹出的入度为0的课程依次记录到数组里就行*/
    public int[] findOrder(int numCourses, int[][] prerequisites) {
        /**如果只有一个课程,拿这个课程当然能完成,他的编号为0*/
        if(numCourses == 1) {
            return new int[]{0};
        }
        /**如果大于一个课程的话我们还是按照解207题的方法,先包装一个课程类出来,然后把课程表里的入度为0的先弹出*/
        /**先定义一个hashMap用来把所有有依赖关系的课程及其依赖初始化一下,没在hashMap里的就是不依赖其他的都是可以完成的
        key是课程编号,value是真正的课程,我们初始化的过程中会把他依赖多少门课以及哪些具体的课程依赖他都确定了*/
        Map<Integer, Course> map = new HashMap<>();
        for(int[] prerequisite : prerequisites) {
            /**prerequisite是一条具体的依赖关系,prerequisite[0]依赖于prerequisite[1]*/
            /**依赖者、被依赖者如果还没有创建Course对象就先创建,因为我们后面的操作都是以Course来的 */
            if(!map.containsKey(prerequisite[0])) {
                Course course = new Course(prerequisite[0]);
                map.put(prerequisite[0], course);
            }
            if(!map.containsKey(prerequisite[1])) {
                Course course = new Course(prerequisite[1]);
                map.put(prerequisite[1], course);
            }
            /**两个课程都有了,我们就可以初始化他们之间的关系了,对于依赖别人的记录一下他到底依赖了多少课程,也就是它的入度*/
            map.get(prerequisite[0]).inDegree ++;
            /**被别人依赖的课程的next增加依赖者*/
            map.get(prerequisite[1]).nexts.add(map.get(prerequisite[0]));
        }
        /**定义结果数组*/
        int[] ans = new int[numCourses];
        /**当前有效长度以及下个要填的位置 */
        int curLen = 0;
        /**遍历一下0~numCourses-1,把没有依赖关系的先放到结果指定位置*/
        for(int i = 0; i < numCourses; i++) {
            if(!map.containsKey(i)) {
                ans[curLen ++] = i;
            }
        }
        /**队列里全是入度为0的 */
        Queue<Course> zeroInQueue = new LinkedList<>();
        /**用一个遍历count记录多少个记录入过队列 */
        int count = 0;
        /**遍历hashMap把入队为0的入队*/
        for(Course course : map.values()) {
            if(course.inDegree == 0) {
                zeroInQueue.offer(course);
            }
        }
        /**弹出队列中的课程,并在弹出时加入答案,同时减少依赖的入度*/
        while(!zeroInQueue.isEmpty()) {
            Course course = zeroInQueue.poll();
            /**课程编号加入结果 */
            ans[curLen ++] = course.courseNo;
            count ++;
            /**把依赖它的课程拿出并把这些依赖性的课程的入队-1*/
            for(Course next : course.nexts) {
                next.inDegree --;
                /**如果就依赖当前课程,那减完就是0了,也符合入队为0的条件 */
                if(next.inDegree == 0) {
                    /**注意我们是在弹出的时候加入结果,这里别加 */
                    zeroInQueue.offer(next);
                }
            }
        }
        /**如果所有的在hashmap中的课程都入过zeroInQueue,说明他们都能完成,返回ans即可,否则整个完不成返回空数组 */
        return count == map.size()? ans : new int[]{};
    }

    static class Course {
        int courseNo;
        int inDegree;
        List<Course> nexts;
        public Course(int courseNo) {
            this.courseNo = courseNo;
            this.nexts = new ArrayList<>();
        }
    }
}

结果一般,因为我利用的数据结构太多了,可以自己考虑改成数组或者别的来代替,我这边着急刷,先不优化了,毕竟面试没几个人管你的常数时间 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2111744.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

集成电路学习:什么是RTC实时时钟

一、RTC&#xff1a;实时时钟 RTC&#xff0c;即实时时钟&#xff08;Real-Time Clock&#xff09;&#xff0c;是一种能够在设备中持续运行并准确记录时间的电子组件。它广泛应用于计算机、手机、嵌入式系统、智能家居设备等多种场合&#xff0c;为这些设备提供精确的时间基准…

利用 Redis 实现延迟队列(点赞场景)

&#x1f308;点赞场景在前段时间有很多人都在争论&#xff0c;我也看了一些视频和文档&#xff0c;最后觉得b站技术的这篇写得很好 【点个赞吧】 - B站千亿级点赞系统服务架构设计 - 哔哩哔哩 &#x1f308;所以我也尝试用 Redis 的延迟队列来写一个点赞处理的 demo&#xff0…

iOS——通知协议代理

通知 概要 观察者和被观察者都无需知晓对方&#xff0c;只需要通过标记在NSNotificationCenter中找到监听该通知所对应的类&#xff0c;从而调用该类的方法。并且在NSNotificationCenter中&#xff0c;观察者可以只订阅某一特定的通知&#xff0c;并对其做出相应操作&#xf…

《论多源数据集成及应用》写作框架,软考高级系统架构设计师

论文真题 在如今信息爆炸的时代,企业、组织和个人面临着大量的数据。这些数据来自不同的渠道和资源,包括传感器、社交媒体、销售记录等,它们各自具有不同的数据格式、分布和存储方式。因此如何收集、整理和清洗数据,以建立一个一致、完整的数据集尤为重要。多源数据集成可…

Leetcode 700-二叉搜索树中的搜索

给定二叉搜索树&#xff08;BST&#xff09;的根节点 root 和一个整数值 val。 你需要在 BST 中找到节点值等于 val 的节点。 返回以该节点为根的子树。 如果节点不存在&#xff0c;则返回 null 。 题解 如果root.val>val&#xff0c;则搜索左子树&#xff0c;如果roo…

finalshell 4.5.x在m1mac闪退

使用过程中会出现突然闪退&#xff0c;尤其在定位生产打开一堆窗口的情况下&#xff0c;绝绝子 闪退崩溃日志&#xff1a; Thread 116 Crashed:: Java: pool-4-thread-28 0 libsystem_kernel.dylib 0x18e926600 __pthread_kill 8 1 libsystem_pthread.dyl…

基于opencv实现双目立体匹配点云距离

双目相机或两个单目相机。 一、相机标定 MATLAB软件&#xff0c;打开双目标定app。 点击add images&#xff0c;弹出加载图像的窗口&#xff0c;分别导入左图和右图&#xff0c;设置黑白格长度&#xff08;标定板的长度一般为20&#xff09;。 点击确定&#xff0c;弹出加载…

ArrayList,LinkedList

ArrayList集合 底层原理 1.利用空参创建的集合&#xff0c;在底层创建一个默认长度为0的数组 2.添加第一个元素时&#xff0c;底层会创建一个新的长度为10的数组 3.存满时&#xff0c;会扩容1.5倍 4.如果一次添加多个元素&#xff0c;1.5倍还放不下&#xff0c;则新创建数…

【C++】list的使用与简单模拟实现

目录 1、list的介绍和使用&#xff1a; 1、结构&#xff1a; 2、接口函数&#xff1a; 迭代器遍历&#xff1a; 增删查改&#xff1a; 翻转与排序&#xff1a; 2、list的模拟实现&#xff1a; 1、节点的封装&#xff1a; 2、迭代器的封装&#xff1a; 3、list的模拟实…

Flutter中自定义气泡框效果的实现

在用户界面的设计中&#xff0c;气泡框&#xff08;Bubble&#xff09;是一种非常有效的视觉工具&#xff0c;它可以用来突出显示信息或提示用户。气泡框广泛应用于聊天应用、通知提示等场景。在 Flutter 中&#xff0c;虽然有很多现成的气泡框组件&#xff0c;但如果你想要更多…

关于 ubuntu系统install的cmake版本较低无法编译项目升级其版本 的解决方法

若该文为原创文章&#xff0c;转载请注明原文出处 本文章博客地址&#xff1a;https://hpzwl.blog.csdn.net/article/details/141933927 长沙红胖子Qt&#xff08;长沙创微智科&#xff09;博文大全&#xff1a;开发技术集合&#xff08;包含Qt实用技术、树莓派、三维、OpenCV…

django摄影竞赛小程序论文源码调试讲解

2系统关键技术及工具简介 系统开发过程中设计的关键技术是系统的核心&#xff0c;而开发工具则会影响的项目开发的进程和效率。第二部分便描述了系统的设计与实现等相关开发工具。 2.1 Python简介 Python 属于一个高层次的脚本语言&#xff0c;以解释性&#xff0c;编译性&am…

Android Studio调试Flutter项目

run运行项目中途&#xff0c;点击Flutter Attach 等一会就可以调试&#xff01; 或者&#xff0c;直接Debug允行项目。

C++相关概念和易错语法(32)(单例模式、类型转换)

1.单例模式 &#xff08;1&#xff09;设计模式是什么&#xff1f; 简单来说&#xff0c;被反复使用&#xff0c;多数人知晓、经过分类的代码设计经验的总结就叫设计模式&#xff0c;它建立在特殊类的设计之上&#xff0c;实现特殊的功能&#xff0c;运用的知识也十分综合。如…

协议集合(学习笔记)

按照数据的传送方式&#xff0c;通信协议可分为以下2种。 串行通信&#xff1a;串行&#xff08;Serial&#xff09;指的是逐个传输数据位&#xff0c;一次只传输一个位。 并行通信&#xff1a;并行&#xff08;Parallel&#xff09;指的是同时传输多个数据位&#xff0c;一次…

VMware 中 kali Linux的安装与使用

文章目录 前言 一、安装虚拟机 二、使用步骤 总结 前言 随着信息技术的飞速发展&#xff0c;虚拟化技术已经成为现代企业和个人用户不可或缺的一部分。通过虚拟化技术&#xff0c;我们可以在一台物理计算机上运行多个独立的操作系统和应用程序&#xff0c;从而实现资源的高效利…

基于WiFi的智能照明控制系统的设计与实现(论文+源码)

1系统方案设计 本设计智能照明控制系统&#xff0c;结合STM32F103单片机、光照检测模块、显示模块、按键模块、太阳能板、LED灯模块、WIFI模块等器件构成整个系统&#xff0c;在功能上可以实现光照强度检测&#xff0c;并且在自动模式下可以自动调节照明亮度&#xff0c;在手动…

【spring】例子2:mvc web开发

领域类 开发时编译时用lombok提供支持 最终生成的包里不包含lombok

【Android】程序开发组件—探究Jetpack

引言 Jetpack是一个开发组件工具集&#xff0c;它的主要目的是帮助我们编写出更加简洁的代码&#xff0c;并简化我们的开发过程&#xff0c;在这么多的组件当中&#xff0c;最需要我们关注的其实还是架构组件&#xff0c;接下来就对Jetpack的主要架构组件进行学习&#xff01;…

数据结构-----栈、队列

一、栈 1、栈(stack)是限定仅在表尾进行插入和删除操作的线性表。 把允许插入和删除的一端称为栈顶&#xff08;top)&#xff0c;另一端称为栈底&#xff08;bottom)&#xff0c;不含任何数据元素的栈称为空栈。栈又称为后进先出&#xff08;Last In First Out)的线性表,简称L…