• LeetCode 210. Course Schedule II


    LeetCode 210. Course Schedule II (课程表 II)

    题目

    链接

    https://leetcode-cn.com/problems/course-schedule-ii/

    问题描述

    现在你总共有 numCourses 门课需要选,记为 0 到 numCourses - 1。给你一个数组 prerequisites ,其中 prerequisites[i] = [ai, bi] ,表示在选修课程 ai 前 必须 先选修 bi 。

    例如,想要学习课程 0 ,你需要先完成课程 1 ,我们用一个匹配来表示:[0,1] 。
    返回你为了学完所有课程所安排的学习顺序。可能会有多个正确的顺序,你只要返回 任意一种 就可以了。如果不可能完成所有课程,返回 一个空数组 。

    示例

    输入:numCourses = 2, prerequisites = [[1,0]]
    输出:[0,1]
    解释:总共有 2 门课程。要学习课程 1,你需要先完成课程 0。因此,正确的课程顺序为 [0,1] 。

    提示

    1 <= numCourses <= 2000
    0 <= prerequisites.length <= numCourses * (numCourses - 1)
    prerequisites[i].length == 2
    0 <= ai, bi < numCourses
    ai != bi
    所有[ai, bi] 互不相同

    思路

    同样是dfs,不过需要注意的就是,其中要设置一个存放答案的集合,最后转置。

    复杂度分析

    时间复杂度 O(n+m)
    空间复杂度 O(n+m)
    

    代码

    Java

       boolean[] onPath;
        boolean[] visited;
        boolean hasCycle = false;
    
        List<Integer>[] buildGraph(int numCourses, int[][] prerequisites) {
            LinkedList<Integer>[] graph = new LinkedList[numCourses];
            for (int i = 0; i < numCourses; i++) {
                graph[i] = new LinkedList<>();
            }
            for (int[] edge : prerequisites) {
                int from = edge[1];
                int to = edge[0];
                graph[from].add(to);
            }
            return graph;
        }
    
        List<Integer> postorder = new ArrayList<>();
    
        public int[] findOrder(int numCourses, int[][] prerequisites) {
            List<Integer>[] graph = buildGraph(numCourses, prerequisites);
            visited = new boolean[numCourses];
            onPath = new boolean[numCourses];
            for (int i = 0; i < numCourses; i++) {
                traverse(graph, i);
            }
    
            if (hasCycle) {
                return new int[]{};
            }
    
            Collections.reverse(postorder);
            int[] res = new int[numCourses];
            for (int i = 0; i < numCourses; i++) {
                res[i] = postorder.get(i);
            }
            return res;
        }
        void traverse(List<Integer>[] graph, int s) {
            if (onPath[s]) {
                hasCycle = true;
            }
            if (visited[s] || hasCycle) {
                return;
            }
            onPath[s] = true;
            visited[s] = true;
            for (int t : graph[s]) {
                traverse(graph, t);
            }
    
            postorder.add(s);
            onPath[s] = false;
        }
    
  • 相关阅读:
    简单团队-爬虫豆瓣top250-项目总结
    团队-爬取豆瓣电影-最终程序
    软件工程课程总结
    课后作业-阅读任务-阅读提问-4
    20171201-构建之法:现代软件工程-阅读笔记》
    团队-爬取豆瓣电影Top250-简单团队一阶段互评
    团队编程项目--爬虫电影网站
    1213-构建之法:现代软件工程-阅读提问3
    简单团队-爬取豆瓣电影TOP250-项目进度
    团队-爬取豆瓣电影-项目总结
  • 原文地址:https://www.cnblogs.com/blogxjc/p/16126079.html
Copyright © 2020-2023  润新知