题目:

There are a total of n courses you have to take, labeled from 0 to n-1.

Some courses may have prerequisites, for example to take course 0 you have to first take course 1, which is expressed as a pair: [0,1]

Given the total number of courses and a list of prerequisite pairs, is it possible for you to finish all courses?

Example 1:

Input: 2, [[1,0]]
Output: true
Explanation: There are a total of 2 courses to take.
  To take course 1 you should have finished course 0. So it is possible.

Example 2:

Input: 2, [[1,0],[0,1]]
Output: false
Explanation: There are a total of 2 courses to take.
  To take course 1 you should have finished course 0, and to take course 0 you should
  also have finished course 1. So it is impossible.

分析:

给定n门课程和他们之间的先修关系,例如[1, 0]就表示修1这门课程要先修完0,判断能否学完所有的课程。

很明显,如果课程中存在循环,就不能完成全部课程。记录每门课程之间的先后顺序,用map存储起来。遍历所有的课程,使用visit数组用来记录每门课程的访问状态,1表示正在访问,2表示已经访问过,访问课程后,在遍历这门课的后续课程,递归执行,如果出现访问的课程状态为1,也就是正在访问,那么表示图中存在环,返回false即可。

程序:

C++

class Solution {
public:
bool canFinish(int numCourses, vector<vector<int>>& prerequisites) {
courses = vector<vector<int>> (numCourses);
for(auto a:prerequisites){
courses[a[1]].push_back(a[0]);
}
vector<int> visit(numCourses);
for(int i = 0; i < numCourses; ++i)
if(dfs(i, visit))
return false;
return true;
}
private:
bool dfs(int curr, vector<int>& visit){
if(visit[curr] == 1)
return true;
if(visit[curr] == 2)
return false;
visit[curr] = 1;
for(auto i:courses[curr])
if(dfs(i, visit))
return true;
visit[curr] = 2;
return false;
}
vector<vector<int>> courses;
};

Java

class Solution {
public boolean canFinish(int numCourses, int[][] prerequisites) {
for(int[] arr:prerequisites){
List<Integer> list = courses.getOrDefault(arr[1], new ArrayList<>());
list.add(arr[0]);
courses.put(arr[1], list);
}
int[] visit = new int[numCourses];
for(int i = 0; i < numCourses; ++i){
if(dfs(i, visit))
return false;
}
return true;
}
private boolean dfs(int curr, int[] visit){
if(visit[curr] == 1)
return true;
if(visit[curr] == 2)
return false;
visit[curr] = 1;
List<Integer> list = courses.get(curr);
if(list != null){
for(int i:list){
if(dfs(i, visit))
return true;
}
}
visit[curr] = 2;
return false;
}
private Map<Integer, List<Integer>> courses = new HashMap<>();
}

LeetCode 207. Course Schedule 课程表 (C++/Java)的更多相关文章

  1. [LeetCode] 207. Course Schedule 课程表

    题目: 分析: 这是一道典型的拓扑排序问题.那么何为拓扑排序? 拓扑排序: 有三件事情A,B,C要完成,A随时可以完成,但B和C只有A完成之后才可完成,那么拓扑排序可以为A>B>C或A&g ...

  2. [leetcode]207. Course Schedule课程表

    在一个有向图中,每次找到一个没有前驱节点的节点(也就是入度为0的节点),然后把它指向其他节点的边都去掉,重复这个过程(BFS),直到所有节点已被找到,或者没有符合条件的节点(如果图中有环存在). /* ...

  3. Java for LeetCode 207 Course Schedule【Medium】

    There are a total of n courses you have to take, labeled from 0 to n - 1. Some courses may have prer ...

  4. [LeetCode] 207. Course Schedule 课程安排

    There are a total of n courses you have to take, labeled from 0 to n - 1. Some courses may have prer ...

  5. LeetCode - 207. Course Schedule

    207. Course Schedule Problem's Link ---------------------------------------------------------------- ...

  6. LN : leetcode 207 Course Schedule

    lc 207 Course Schedule 207 Course Schedule There are a total of n courses you have to take, labeled ...

  7. [LeetCode] 207. Course Schedule 课程清单

    There are a total of n courses you have to take, labeled from 0 to n-1. Some courses may have prereq ...

  8. (medium)LeetCode 207.Course Schedule

    There are a total of n courses you have to take, labeled from 0 to n - 1. Some courses may have prer ...

  9. LeetCode 207. Course Schedule(拓扑排序)

    题目 There are a total of n courses you have to take, labeled from 0 to n - 1. Some courses may have p ...

  10. Java for LeetCode 210 Course Schedule II

    There are a total of n courses you have to take, labeled from 0 to n - 1. Some courses may have prer ...

随机推荐

  1. Kruise Rollout:灵活可插拔的渐进式发布框架

    简介: Kruise Rollout 是 OpenKruise 社区开源的渐进式交付框架.Kruise Rollout 支持配合流量和实例灰度的金丝雀发布.蓝绿发布.A/B Testing 发布,以及 ...

  2. 全面提升易用性:OpenClusterManagement 0.7 版本发布

    ​简介:千呼万唤始出来,三月末 OpenClusterManagement 社区正式发布了 v0.7 版本.在新的版本有一系列新的功能特性欢迎感兴趣的读者体验探索,同时在这个版本中社区维护者对目前已有 ...

  3. WPF 使用 Skia 解析绘制 SVG 图片

    本文告诉大家如何在 WPF 里面,使用 Skia 解析绘制 SVG 图片.本文也适合控制台使用 SkiaSharp 解析绘制 SVG 图片,本文的 WPF 部分只是在 Skia 绘制完成之后,将 Sk ...

  4. 安装petalinux

    1.petalinux工具下载,下载地址: https://china.xilinx.com/support/download/index.html/content/xilinx/zh/downloa ...

  5. k8s问题解决

    问题1: 问题描述:k8s中Terminating状态pod不能删除 [root@master ~]# kubectl get pods -n ms NAME READY STATUS RESTART ...

  6. Java中使用try代码块自动关闭各种流(IO流……)

    推荐写在 try 的括号中 /** 方式一.方式二是等价的 * <li>推荐使用方式一</li> * @since 2023/5/18 0018 * @author CC ** ...

  7. Util 应用框架 UI 全新升级

    Util UI 已经开发多年, 并在多家公司的项目使用. 不过一直以来, Util UI 存在一些缺陷, 始终未能解决. 最近几个月, Util 团队下定决心, 终于彻底解决了所有已知缺陷. Util ...

  8. 通过劫持线程arena实现任意地址分配 n1ctf2018_null

    通过劫持线程arena,当堆开了一个线程之后,如果没有做好保护随之的危险也悄然而至 BUU上的n1ctf2018_null很好的说明了这个问题 题目链接:BUUCTF在线评测 (buuoj.cn) 看 ...

  9. kali linux 渗透测试 01 kali介绍

    安全问题的根源 分层思想------盲人摸象 只追求功能实现----比较片面 最大的安全威胁是人---- 安全目标 先于攻击者发现和防止漏洞出现 攻击型安全 防护性安全 渗透测试 尝试击破安全防御机制 ...

  10. Oracle中ALTER TABLE的五种用法(二)

    首发微信公众号:SQL数据库运维 原文链接:https://mp.weixin.qq.com/s?__biz=MzI1NTQyNzg3MQ==&mid=2247485212&idx=1 ...