1. 具体题目

现在你总共有 n 门课需要选,记为 0 到 n-1。在选修某些课程之前需要一些先修课程。 例如,想要学习课程 0 ,你需要先完成课程 1 ,我们用一个匹配来表示他们: [0,1]。给定课程总量以及它们的先决条件,判断是否可能完成所有课程的学习?

示例 1:  输入: 2, [[1,0]]   输出: true  解释: 总共有 2 门课程。学习课程 1 之前,你需要完成课程 0。所以这是可能的。

说明: 输入的先决条件是由边缘列表表示的图形,而不是邻接矩阵,可以假定输入的先决条件中没有重复的边。

2. 思路分析

本题可套用有向图的拓扑排序算法——在构造一个有向图的拓扑序列时,若所有顶点都被输出过,那么说明该图不存在环,否则该图中有环。

有效的课程表中不应存在环路,所以要求构造过程中,所有顶点都被输出过。

边缘列表存储图的形式见 https://visualgo.net/en/graphds,例如顶点 V0 指向顶点 V1 表示为 prerequisites[i][1] -> prerequisites[i][0]

3. 代码

 public boolean canFinish(int numCourses, int[][] prerequisites) {
int[] in = new int[numCourses];
for(int[] nums : prerequisites){
in[nums[0]]++; //统计各顶点入度
}
Stack<Integer> stack = new Stack<>(); //记录入度为 0 的顶点
for(int i = 0; i < numCourses; i++){
if(in[i] == 0){
stack.push(i);
}
}
while(!stack.empty()){
int course = stack.pop();
numCourses--;
for(int[] nums : prerequisites){
if(nums[1] == course){ //将当前顶点连接的所有顶点的入度 -1
if(--in[nums[0]] == 0) stack.push(nums[0]); //若-1后入度为0则进栈
}
}
}
return numCourses == 0;
}

leetcode.图.207课程表-Java的更多相关文章

  1. Java实现 LeetCode 207 课程表

    207. 课程表 现在你总共有 n 门课需要选,记为 0 到 n-1. 在选修某些课程之前需要一些先修课程. 例如,想要学习课程 0 ,你需要先完成课程 1 ,我们用一个匹配来表示他们: [0,1] ...

  2. 三张图彻底了解Java中字符串的不变性

    转载: 三张图彻底了解Java中字符串的不变性 定义一个字符串 String s = "abcd"; s中保存了string对象的引用.下面的箭头可以理解为"存储他的引用 ...

  3. PowerDesigner(八)-面向对象模型(用例图,序列图,类图,生成Java源代码及Java源代码生成类图)(转)

    面向对象模型 面向对象模型是利用UML(统一建模语言)的图形来描述系统结构的模型,它从不同角度实现系统的工作状态.这些图形有助于用户,管理人员,系统分析人员,开发人员,测试人员和其他人员之间进行信息交 ...

  4. LeetCode第[18]题(Java):4Sum 标签:Array

    题目难度:Medium 题目: Given an array S of n integers, are there elements a, b, c, and d in S such that a + ...

  5. LeetCode第[1]题(Java):Two Sum 标签:Array

    题目: Given an array of integers, return indices of the two numbers such that they add up to a specifi ...

  6. 八、面向对象模型(用例图,序列图,类图,生成Java源代码及Java源代码生成类图)

    面向对象模型 面向对象模型是利用UML(统一建模语言)的图形来描述系统结构的模型,它从不同角度实现系统的工作状态.这些图形有助于用户,管理人员,系统分析人员,开发人员,测试人员和其他人员之间进行信息交 ...

  7. java基础思维导图,让java不再难懂

    java基础思维导图,让java不再难懂 原文链接  https://my.oschina.net/u/3080373/blog/873056 最近看了一些文章的思维导图,发现思维导图真是个强大的工具 ...

  8. LeetCode第[46]题(Java):Permutations(求所有全排列) 含扩展——第[47]题Permutations 2

    题目:求所有全排列 难度:Medium 题目内容: Given a collection of distinct integers, return all possible permutations. ...

  9. LeetCode第[1]题(Java):Two Sum (俩数和为目标数的下标)——EASY

    题目: Given an array of integers, return indices of the two numbers such that they add up to a specifi ...

随机推荐

  1. 20191107PHP创建数组练习

    数组练习 <?php //创建的方式 //1 $arr=array(20,30,50); $arr1=[30,60,70]; //3 //当遇到这种情况的时候键(key)是相同的,会取后面的赋值 ...

  2. 一些常见的js校验

    今天有时间来总结一下那些常用的js校验: vernull = function(value){//非空校验 if(value.trim(value).length == 0){ return fals ...

  3. 最强大的Android线程池框架

    背景 大家都知道在我们的开发中永远都离不开多线程,对于我们为什么要使用多线程,多线程的使用和多线程的一些基础知识这里我们就不讲了,有兴趣的朋友可以去看一下博主之前的几篇文章: 线程你真的了解它吗 这才 ...

  4. 【Leetcode周赛】从contest-111开始。(一般是10个contest写一篇文章)

    Contest 111 (题号941-944)(2019年1月19日,补充题解,主要是943题) 链接:https://leetcode.com/contest/weekly-contest-111 ...

  5. Sass--混合宏的不足

    混合宏在实际编码中给我们带来很多方便之处,特别是对于复用重复代码块.但其最大的不足之处是会生成冗余的代码块.比如在不同的地方调用一个相同的混合宏时.如: @mixin border-radius{ - ...

  6. html5 图片墙

    代码实例: <!DOCTYPE html> <html> <head> <style> body,html{ padding:0;margin:0;wi ...

  7. jmeter 参数化5_Count 计数器

    如果需要引用的数据量较大,且要求不能重复或者需要自增,那么可以使用计数器来实现. 计数器(counter):允许用户创建一个在线程组之内都可以被引用的计数器. 计数器允许用户配置一个起点,一个最大值, ...

  8. 【leetcode】1021. Remove Outermost Parentheses

    题目如下: A valid parentheses string is either empty (""), "(" + A + ")", ...

  9. webpack.config.js配置入口出口文件

    目录结构: 新建webpack.config.js配置文件 const path = require('path') //导出 path是node内置的包 通过npm init初始化得到package ...

  10. mybatis用distinct进行查询的问题

    一:mybatis进行distinct进行查询的时候,数据库中可能有值为null的. 如果直接这样写,这个null的都给计算出来了. select DISTINCT b.b_city from bui ...