首页 > 编程语言 >#yyds干货盘点# LeetCode程序员面试金典:课程表

#yyds干货盘点# LeetCode程序员面试金典:课程表

时间:2023-08-05 13:32:28浏览次数:35  
标签:yyds int 金典 numCourses edges prerequisites 课程 课程表 visited

题目:

你这个学期必须选修 numCourses 门课程,记为 0 到 numCourses - 1 。

在选修某些课程之前需要一些先修课程。 先修课程按数组 prerequisites 给出,其中 prerequisites[i] = [ai, bi] ,表示如果要学习课程 ai 则 必须 先学习课程  bi 。

例如,先修课程对 [0, 1] 表示:想要学习课程 0 ,你需要先完成课程 1 。

请你判断是否可能完成所有课程的学习?如果可以,返回 true ;否则,返回 false 。

 

示例 1:

输入:numCourses = 2, prerequisites = [[1,0]]

输出:true

解释:总共有 2 门课程。学习课程 1 之前,你需要完成课程 0 。这是可能的。

示例 2:

输入:numCourses = 2, prerequisites = [[1,0],[0,1]]

输出:false

解释:总共有 2 门课程。学习课程 1 之前,你需要先完成课程 0 ;并且学习课程 0 之前,你还应先完成课程 1 。这是不可能的。

代码实现:

class Solution {
    List<List<Integer>> edges;
    int[] visited;
    boolean valid = true;

    public boolean canFinish(int numCourses, int[][] prerequisites) {
        edges = new ArrayList<List<Integer>>();
        for (int i = 0; i < numCourses; ++i) {
            edges.add(new ArrayList<Integer>());
        }
        visited = new int[numCourses];
        for (int[] info : prerequisites) {
            edges.get(info[1]).add(info[0]);
        }
        for (int i = 0; i < numCourses && valid; ++i) {
            if (visited[i] == 0) {
                dfs(i);
            }
        }
        return valid;
    }

    public void dfs(int u) {
        visited[u] = 1;
        for (int v: edges.get(u)) {
            if (visited[v] == 0) {
                dfs(v);
                if (!valid) {
                    return;
                }
            } else if (visited[v] == 1) {
                valid = false;
                return;
            }
        }
        visited[u] = 2;
    }
}

标签:yyds,int,金典,numCourses,edges,prerequisites,课程,课程表,visited
From: https://blog.51cto.com/u_13321676/6975110

相关文章

  • #yyds干货盘点# LeetCode程序员面试金典:统计各位数字都不同的数字个数
    1.简述:给你一个整数n,统计并返回各位数字都不同的数字x的个数,其中0<=x<10n 。 示例1:输入:n=2输出:91解释:答案应为除去11、22、33、44、55、66、77、88、99外,在0≤x<100范围内的所有数字。示例2:输入:n=0输出:12.代码实现:classSolution{publicintcount......
  • #yyds干货盘点#Redis分布式锁正确打开方式
    1、为什么要有分布式锁?JUC提供的锁机制,可以保证在同一个JVM进程中同一时刻只有一个线程执行操作逻辑;多服务多节点的情况下,就意味着有多个JVM进程,要做到这样,就需要有一个中间人;分布式锁就是用来保证在同一时刻,仅有一个JVM进程中的一个线程在执行操作逻辑;换句话说,JUC的锁和分布式锁都......
  • #yyds干货盘点#map()和flatMap()的区别?
    在Java8中,map()和flatMap()是StreamAPI中的两个常用方法,用于对流中的元素进行转换操作。它们的主要区别在于它们的返回类型和转换方式。map()方法:map()方法将流中的每个元素都映射到另一个对象。它接收一个函数作为参数,该函数将当前流中的每个元素转换为另一个对象。map()方法的......
  • # yyds干货盘点 # 盘点一个可以一键免费下载图片的谷歌插件
    大家好,我是皮皮。一、前言前几天在Python知识星球里边看到【七年】大佬推荐的一个谷歌浏览器插件,可以一键下载浏览器中的图片或者PPT,这里也推荐给大家,一起来看看吧!二、实现过程这个插件是免费的,非常奈斯,但是在谷歌浏览器中下载的时候,需要借助ti子,在谷歌浏览器应用商店里边搜索【图......
  • # yyds干货盘点 # 盘点一个Python递归的基础题目
    大家好,我是皮皮。一、前言前几天在Python黄金群【维哥】问了一个Python递归的基础问题,一起来看看吧。看上去代码没多少哈,但是韵味无穷。二、实现过程很多初学者遇到这个问题,很容易把答案说成是3,2,2这样,其实正好相反,这里【巭孬嫑勥烎】给了一个解释。这么一看好像还是不太好理解,看看......
  • #yyds干货盘点#什么是死锁以及如何解决死锁
    死锁是指两个或多个线程在互相等待对方释放锁的状态,从而导致程序无法继续执行的情况。在Java多线程中,死锁通常是由于以下四种情况的组合所导致的:互斥:多个线程竞争同一资源(如锁),每次只能有一个线程占用,其他线程必须等待。占有且等待:线程在持有锁的同时,等待其他线程持有的锁。不可抢占......
  • #yyds干货盘点#Java虚拟机基本结构
    类加载子系统类加载子系统负责从文件系统或网络中加载Class信息,加载的类的数据结构存放于一块叫方法区的内存空间中。方法区方法区主要存储类加载后的数据结构信息、运行时常量池信息、字符串、数字常量(这部分常量信息是Class文件中常量池部分的内存映射)(JDK1.7之前,JDK1.7之后字符......
  • LeetCode/课程表IV
    你总共需要上numCourses门课,课程编号依次为0到numCourses-1。你会得到一个数组prerequisite,其中prerequisites[i]=[ai,bi]表示如果你想选bi课程,你必须先选ai课程。有的课会有直接的先修课程,比如如果想上课程1,你必须先上课程0,那么会以[0,1]数对的形式给......
  • #yyds干货盘点#JavaScript正则表达式(手机号码、邮箱、日期)
    JavaScript正则表达式(手机号码、邮箱、日期)在平时的工作中,经常会遇到一些验证的功能,其中如号码、邮箱、日期之类的验证,但是在平常使用时,直接就抄了一份用,并没有很详细的研究过,所以就在这儿记录了一些常用的表达式,慢慢学习的同时,也分享给大家。手机号码由于现在虚拟号码的使用,所以......
  • #yyds干货盘点#python 正则表达式 re 模块总结
    使用爬虫爬取网页数据的过程中,需要利用各种工具解析网页中的数据,比如:etree,BeautifulSoup,scrapy 等工具,但是功能最强大的还是正则表达式,下面将对python的re模块方法做一个总结。Python 通过 re 模块提供对正则表达式的支持。使用 re 的一般步骤是:使用 re.compile(正则表......