• [LeetCode] 1462. Course Schedule IV


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

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

    Given the total number of courses n, a list of direct prerequisite pairs and a list of queries pairs.

    You should answer for each queries[i] whether the course queries[i][0] is a prerequisite of the course queries[i][1] or not.

    Return a list of boolean, the answers to the given queries.

    Please note that if course a is a prerequisite of course b and course b is a prerequisite of course c, then, course a is a prerequisite of course c.

    Example 1:

    Input: n = 2, prerequisites = [[1,0]], queries = [[0,1],[1,0]]
    Output: [false,true]
    Explanation: course 0 is not a prerequisite of course 1 but the opposite is true.
    

    Example 2:

    Input: n = 2, prerequisites = [], queries = [[1,0],[0,1]]
    Output: [false,false]
    Explanation: There are no prerequisites and each course is independent.
    

    Example 3:

    Input: n = 3, prerequisites = [[1,2],[1,0],[2,0]], queries = [[1,0],[1,2]]
    Output: [true,true]
    

    Example 4:

    Input: n = 3, prerequisites = [[1,0],[2,0]], queries = [[0,1],[2,0]]
    Output: [false,true]
    

    Example 5:

    Input: n = 5, prerequisites = [[0,1],[1,2],[2,3],[3,4]], queries = [[0,4],[4,0],[1,3],[3,0]]
    Output: [true,false,true,false]

    Constraints:

    • 2 <= n <= 100
    • 0 <= prerequisite.length <= (n * (n - 1) / 2)
    • 0 <= prerequisite[i][0], prerequisite[i][1] < n
    • prerequisite[i][0] != prerequisite[i][1]
    • The prerequisites graph has no cycles.
    • The prerequisites graph has no repeated edges.
    • 1 <= queries.length <= 10^4
    • queries[i][0] != queries[i][1]

    课程安排IV。题意是一共有 N 门课程需要修,他们的编号是从0到 N - 1。其中有一些课程是有直接的先修课程prerequisites的,会以数对形式表示。现在给你课程总数 N 和一个直接先修课程数对列表 prerequisite 和一个查询对列表 queries。对于每个查询对 queries[i],请判断 queries[i][0] 是否是 queries[i][1] 的先修课程。

    这道题我给出一个比较朴素的解法,还是涉及到拓扑排序。对于这道题,你需要一个入度表 indegree 记录课程的入度和两个hashmap,一个 adj 哈希表用来记录课程之间的邻接关系;一个 preMap 哈希表用来记录课程之间的先修关系。首先对于每一个课程 i ,我们需要为这个课程在邻接表和先修表里创建一个hashset以记录课程之间的关系。

    接着遍历直接先修课程数对列表 prerequisite,记录课程的入度,同时也记录各个课程的邻接关系。接着还是跟之前的课程安排的题一样,把入度为0的课程加入queue,意思是从不需要先修课程的课开始找起,去创建课程之间的先修关系。从queue弹出一个课程cur的时候,从邻接哈希表 adj 拿到cur的所有邻接课程,同时因为cur的入度为0所以对于每一个 next 课程而言,cur课程一定是next的先修课程,所以我们在 preMap 里找到 next ,并且把 cur 加入 next 的先修课程里。同时如果 cur 自己也有先修课程,也需要把他们统统加入 next 的先修课程的hashset里。

    最后对于需要判断的 queries,因为queries[0]是先修课程,queries[1]是后继课程,所以判断的方式是看看 preMap 里key为queries[0]的hashset是否包含queries[1]。

    时间O(n^2)

    空间O(n)

    Java实现

     1 class Solution {
     2     public List<Boolean> checkIfPrerequisite(int n, int[][] prerequisites, int[][] queries) {
     3         int[] indegree = new int[n];
     4         HashMap<Integer, Set<Integer>> adj = new HashMap<>();
     5         HashMap<Integer, Set<Integer>> preMap = new HashMap<>();
     6         for (int i = 0; i < n; i++) {
     7             preMap.put(i, new HashSet<>());
     8             adj.put(i, new HashSet<>());
     9         }
    10         for (int[] pre : prerequisites) {
    11             indegree[pre[1]]++;
    12             adj.get(pre[0]).add(pre[1]);
    13         }
    14         Queue<Integer> queue = new LinkedList<>();
    15         for (int i = 0; i < n; i++) {
    16             if (indegree[i] == 0) {
    17                 queue.offer(i);
    18             }
    19         }
    20         while (!queue.isEmpty()) {
    21             int cur = queue.poll();
    22             Set<Integer> set = adj.get(cur);
    23             for (int next : set) {
    24                 preMap.get(next).add(cur);
    25                 preMap.get(next).addAll(preMap.get(cur));
    26                 indegree[next]--;
    27                 if (indegree[next] == 0) {
    28                     queue.offer(next);
    29                 }
    30             }
    31         }
    32         List<Boolean> res = new ArrayList<>();
    33         for (int[] pair : queries) {
    34             Set<Integer> set = preMap.get(pair[1]);
    35             if (set.contains(pair[0])) {
    36                 res.add(true);
    37             } else {
    38                 res.add(false);
    39             }
    40         }
    41         return res;
    42     }
    43 }

    相关题目

    207. Course Schedule

    210. Course Schedule II

    269. Alien Dictionary

    953. Verifying an Alien Dictionary

    1462. Course Schedule IV

    LeetCode 题目总结

  • 相关阅读:
    【愚人节快乐】拥抱Bootstrap,FineUI新版效果超炫!
    FineUIMvc新特性速递(大间距模式,隐藏菜单垂直滚动条)
    FineUI经典项目展示(2)基础管理系统(附在线演示)
    FineUIMvc随笔(6)对比WebForms和MVC中表格的数据库分页
    FineUIMvc随笔(5)UIHelper是个什么梗?
    FineUIMvc随笔(4)自定义回发参数与自定义回发
    FineUIMvc随笔(3)不能忘却的回发(__doPostBack)
    FineUI经典项目展示(1)生产在线管理系统
    FineUIMvc随笔(2)怎样在控件中嵌套 HTML
    FineUIPro v3.5.0发布了,减少 90% 的上行数据量,15行代码全搞定!
  • 原文地址:https://www.cnblogs.com/cnoodle/p/13737802.html
Copyright © 2020-2023  润新知