【Hot100】LeetCode—207. 课程表

news2025/1/11 3:58:29

目录

  • 1- 思路
    • 有向图+记录入度数组+出度列表
  • 2- 实现
    • ⭐207. 课程表——题解思路
  • 3- ACM 实现

  • 题目连接:207. 课程表

1- 思路

有向图+记录入度数组+出度列表

  • 根据输入
  • ① 构造遍历构造入度数组
  • ② 构造出度列表
  • 根据入度数组为 0 的数 加入到 队列中,进行处理

image.png


2- 实现

⭐207. 课程表——题解思路

在这里插入图片描述

class Solution {
    public boolean canFinish(int numCourses, int[][] prerequisites) {

        // 定义入度数组
        int[] inNums = new int[numCourses];
        // 出度列表
        List<List<Integer>> outList = new ArrayList<>();
        Queue<Integer> queue = new LinkedList<>();


        //初始化出度
        for(int i = 0 ; i < numCourses ;i++){
            outList.add(new ArrayList<>());
        }
        // 入度初始化
        // [1] 为 入度的 key ,value 进行 ++ 即可
        for(int[] num:prerequisites){
            inNums[num[0]]++;
            // 链表也要初始化
            outList.get(num[1]).add(num[0]);
        }

        for(int i = 0 ; i < numCourses;i++){
            if(inNums[i] == 0){
                queue.add(i);
            }
        }
        // 处理 0 
        while(!queue.isEmpty()){
            int pre = queue.poll();
            // 先对课程减减
            numCourses--;
            // 处理链表
            for(int num: outList.get(pre)){
                inNums[num]--;
                if(inNums[num]==0){
                    queue.add(num);
                }
            }
        }
        return numCourses==0;
    }
}

3- ACM 实现

public class canFinish {


    public static boolean canFinish(int numCourses, int[][] prerequisites){
        // 1. 数据结构
        // 入度、出度、队列
        int[] inNums = new int[numCourses];
        List<List<Integer>> outList = new ArrayList<>();
        Queue<Integer> queue = new LinkedList<>();

        // 2. 初始化出度
        for(int i = 0 ; i < numCourses;i++){
            outList.add(new ArrayList<>());
        }
        // 3. 遍历数组,初始化入度和出度
        for(int[] num:prerequisites){
            // 入度
            inNums[num[0]] ++;
            // 出度
            outList.get(num[1]).add(num[0]);
        }

        // 4. 初始化队列
        for(int i = 0 ; i < numCourses;i++){
            if(inNums[i]==0){
                queue.add(i);
            }
        }
        // 遍历 queue
        while(!queue.isEmpty()){
            int pre = queue.poll();
            numCourses--;
            for (int num:outList.get(pre)){
                inNums[num]--;
                if(inNums[num] == 0){
                    queue.add(num);
                }
            }
        }
        return numCourses==0;
    }


    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.println("输入课程数");
        int numCourses = sc.nextInt();
        String konge = sc.nextLine();
        System.out.println("输入二维数组");
        String input = sc.nextLine();
        input = input.substring(2,input.length()-2);
        String[] rows = input.split("],\\[");
        int m = rows.length;
        int n = rows[0].split(",").length;
        int[][] prerequisites = new int[m][n];
        for(int i = 0 ; i < m;i++){
            String[] row = rows[i].split(",");
            for(int j = 0 ; j < n;j++){
                prerequisites[i][j] = Integer.parseInt(row[j]);
            }
        }

        System.out.println("结果是"+canFinish(numCourses,prerequisites));
    }
}

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

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

相关文章

在线拼图用什么软件?5款顶级照片拼接工具

照片拼接在一起用什么软件&#xff1f;当你想全景展现山西应县木塔的震撼之美时&#xff0c;5款精选照片拼接软件能帮你解锁全新视角。 这座千年古塔&#xff0c;巍峨耸立&#xff0c;细节之处尽显匠心独运。而通过拼接技术&#xff0c;每一块木构的精致、每一层塔檐的飞翘都能…

OpenBayes 教程上新 | 青岛小哥焦恩俊版二郎神来袭,MuseV + MuseTalk 分分钟实现高质量数字人制作!

使用传统的数字人训练方案生成一个高质量的数字人&#xff0c;常常需要大量的时间和算力资源&#xff0c;同时对训练素材的要求也较高&#xff0c;如果想要达到良好的唇形一致效果&#xff0c;通常需要数小时乃至更久。 MuseV 和 MuseTalk 的出现为数字人领域带来了新的突破&a…

【Canvas与桌面】十字网格黑灰背景(1920x1080)

【成图】 【代码】 <!DOCTYPE html> <html lang"utf-8"> <meta http-equiv"Content-Type" content"text/html; charsetutf-8"/> <head><title>十字网格黑灰背景(1920x1080)</title><style type"te…

iphone被锁定怎么解锁?iPhone密码锁解锁办法分享

在忙碌的生活中&#xff0c;有时我们可能会遇到一些“小插曲”&#xff0c;比如苹果手机被锁定&#xff0c;iPhone被锁定是一个常见的问题&#xff0c;可能是由于忘记密码、多次输入错误密码或设备被远程锁定等原因造成的。 本文将介绍解锁被锁定的iPhone的方法以及注意事项&a…

【网络安全】IDOR之请求包分析

未经许可,不得转载。 文章目录 正文正文 某在线游戏平台,在开始测试时,我访问了 /profile 页面(个人资料页面),然后查看 Burp 历史记录,想查看有多少隐藏的请求。 可以看到一个HTTP 的 OPTIONS 方法的请求包: 从图中看到,该请求包含两个参数:player_id_or_name(用…

OpenHarmony源码解析之电话子系统——通话流程

一、简介 OpenAtom OpenHarmony&#xff08;以下简称“OpenHarmony”&#xff09;电话子系统为 OS 提供了基础的无线通信能力。 支持 TD-LTE/FDD-LTE/TD-SCDMA/WCDMA/EVDO/CDMA1X/GSM 等网络制式的通信模块&#xff0c;能够提供高速的无线数据传输、互联网接入等业务&#xf…

c++栈和队列(stack和queue)

前言 栈和队列是两个极其相似的数据结构&#xff0c;栈具有先进后出的特性&#xff0c;队列具有先进先出的特性。今天我们就来简单的介绍一下栈和队列这两数据结构&#xff0c;其中队列我们介绍普通队列、双端队列&#xff08;了解&#xff09;和优先级队列&#xff08;其实这…

C++从入门到起飞之——vector模拟实现 全方位剖析!

​ &#x1f308;个人主页&#xff1a;秋风起&#xff0c;再归来~&#x1f525;系列专栏&#xff1a;C从入门到起飞 &#x1f516;克心守己&#xff0c;律己则安 目录 1、vector的成员变量 2、迭代器 3、size与capacity 4、[]运算符重载 5、reserve 6、push_bac…

LSTM结合时序异常检测直接写!小论文闭着眼睛发!

还在愁小论文&#xff1f;不如考虑考虑这个方向&#xff1a;LSTM时间序列异常检测。 这是个比较活跃且热门的研究方向&#xff0c;因为LSTM具有非常优秀的时序数据深度处理能力&#xff0c;能够灵活适应不同复杂度的数据&#xff0c;给我们提供高精度的预测结果&#xff0c;在…

时间继电器和定时器

一、概述 1.时间继电器是可以在设定的定时周期内或周期后闭合或断开触点的元器件。 2.时间继电器上可设定的定时周期数量有限&#xff0c;多为一个或两个。定时时长从0.02s至300h(根据产品型号范围不同)。 3.定时器可以理解为一台钟表&#xff0c;它在某个时间点上闭合(断开…

PostgreSQL如何设置主键自增(序列、SERIAL)

文章目录 PostgreSQL如何设置主键自增背景什么是序列Postgresql的自增机制基本使用使用SERIAL或BIGSERIAL数据类型手动创建序列和设置默认值实战demo&#xff1a;PostgreSQL 手动序列管理设置序列的当前值 工作常用总结创建表时候自定义序列&#xff1a;id SERIAL PRIMARY KEY …

调用具体接口的所有实现类

Java获取接口的所有实现类方法-CSDN博客https://blog.csdn.net/feeltouch/article/details/135399078

最实用接地气的 .NET 微服务框架

目录 前言 项目介绍 快速入门 1、服务注册 2、启动UI 3、服务发现与调用 4、启动服务网关 项目地址 最后 前言 微服务架构已经成为搭建高效、可扩展系统的关键技术之一&#xff0c;然而&#xff0c;现有许多微服务框架往往过于复杂&#xff0c;使得我们普通开发者难以…

基于生成对抗模型GAN蒸馏的方法FAKD及其在EdgesSRGAN中的应用

文章目录 FAKD系列论文paper1: FAKD&#xff1a;用于高效图像超分辨率的特征亲和知识蒸馏&#xff08;2020&#xff09;ABSTRACT1. INTRODUCTION2. PROPOSED METHOD2.1. Feature Affinity-based Distillation (FAKD) 2.2. Overall Loss Function3. EXPERIMENTAL RESULTS3.1. Ex…

TypeSript9 命名空间namesapce

我们在工作中无法避免全局变量造成的污染&#xff0c;TypeScript提供了namespace 避免这个问题出现 内部模块&#xff0c;主要用于组织代码&#xff0c;避免命名冲突。命名空间内的类默认私有通过 export 暴露通过 namespace 关键字定义 TypeScript与ECMAScript 2015一样&…

React学习day02-React事件绑定、组件、useState、React组件样式处理方式

3、React事件绑定&#xff08;以点击事件为例&#xff09; &#xff08;1&#xff09;语法&#xff08;整体遵循驼峰命名法&#xff09;&#xff1a;on事件名称{事件处理程序} 比如&#xff1a;点击事件onClick&#xff08;类似于vue中的click&#xff09; &#xff08;2&…

成为Python高手,我能给出的最好建议

今天笔者将向大家分享5个良好的Python编程习惯&#xff0c;大牛认证&#xff0c;通过不断实践&#xff0c;助你写出更Pythonic的代码&#xff0c;让你向Python大师之路更进一步。 今天笔者将向大家分享5个良好的Python编程习惯&#xff0c;大牛认证&#xff0c;通过不断实践&a…

Java面试题精选:消息队列(二)

一、Kafka的特性 1.消息持久化&#xff1a;消息存储在磁盘&#xff0c;所以消息不会丢失 2.高吞吐量&#xff1a;可以轻松实现单机百万级别的并发 3.扩展性&#xff1a;扩展性强&#xff0c;还是动态扩展 4.多客户端支持&#xff1a;支持多种语言&#xff08;Java、C、C、GO、…

WPF中如何根据数据类型使用不同的数据模板

我们在将一个数据集合绑定到列表控件时&#xff0c;有时候想根据不同的数据类型&#xff0c;显示为不同的效果。 例如将一个文件夹集合绑定到ListBox时&#xff0c;系统文件夹和普通文件夹分别显示为不同的效果&#xff0c;就可以使用模板选择器功能。 WPF提供了一个模板选择…

查找4(散列表)

1&#xff09;基本概念 、 2)散列函数的构造 3&#xff09;解决冲突 I&#xff09;开放地址发 II&#xff09;链地址法 4&#xff09;散列表的查找