`

Course Schedule II

阅读更多
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, return the ordering of courses you should take to finish all courses.

There may be multiple correct orders, you just need to return one of them. If it is impossible to finish all courses, return an empty array.

For example:

2, [[1,0]]
There are a total of 2 courses to take. To take course 1 you should have finished course 0. So the correct course order is [0,1]

4, [[1,0],[2,0],[3,1],[3,2]]
There are a total of 4 courses to take. To take course 3 you should have finished both courses 1 and 2. Both courses 1 and 2 should be taken after you finished course 0. So one correct course order is [0,1,2,3]. Another correct ordering is[0,2,1,3].

在Course Schedule 1的基础上输出一个可以完成所有课程的序列。只需要在递归完之后记录节点就可以了。代码如下:
public class Solution {
    boolean[] onStack;
    boolean[] isVisited;
    LinkedList<Integer> list;
    public int[] findOrder(int numCourses, int[][] prerequisites) {
        int[] result = new int[numCourses];
        list = new LinkedList<Integer>();
        List<Integer>[] graph = new List[numCourses];
        onStack = new boolean[numCourses];
        isVisited = new boolean[numCourses];
        for(int i = 0; i < prerequisites.length; i++) {
            int key = prerequisites[i][1];
            int value = prerequisites[i][0];
            if(graph[key] == null) graph[key] = new ArrayList<Integer>();
            graph[key].add(value);
        }
        for(int i = 0; i < numCourses; i++) {
            if(isVisited[i] == false && hasCycle(i, graph) == true)
                return new int[0];
        }
        for(int i = 0; i < list.size(); i++) {
            result[i] = list.get(i);
        }
        return result;
    }
    
    public boolean hasCycle(int i, List<Integer>[] graph) {
        boolean cycle = false;
        onStack[i] = true;
        isVisited[i] = true;
        if(graph[i] != null) {
            for(int c : graph[i]) {
                if(isVisited[c] == false) {
                    cycle = hasCycle(c, graph);
                    if(cycle == true)
                        break;
                } else if(onStack[c] == true) {
                    cycle = true;
                    break;
                }
            }
        }
        onStack[i] = false;
        list.addFirst(i);
        return cycle;
    }
}
分享到:
评论

相关推荐

    java-leetcode题解之Course Schedule III.java

    java java_leetcode题解之Course Schedule III.java

    算法相关汇总1

    11. Course Schedule II问题 可以使用BFS的方法,逐渐抹去入度为0的节点以及他们的边,将大问题化小。 12. 买卖股票最佳时期问题 可以使用hard级别的方法,两次,求最大收益。 13. 岛屿最大面积系列问题 可以...

    python-leetcode题解之207-Course-Schedule.py

    python python_leetcode题解之207_Course_Schedule.py

    University Course Schedule Builder-开源

    "University Course Schedule Builder",一款开源的课程日程规划工具,以其独特的优势,为大学提供了定制化、高效且灵活的课表解决方案。 开源软件的一大优势在于其开放源代码,允许用户自由查看、修改和分发代码。...

    web-schedule-course-master.zip

    "web-schedule-course-master.zip"这个压缩包文件,很可能是某个在线课程或教程的资源集合,专注于讲解Web调度相关的知识。通过分析其文件结构,我们可以深入探讨Web调度的核心概念、应用场景以及实现技术。 Web...

    ECSU Course Schedule Assistant-crx插件

    确定课程列表的可能时间表 这是一项扩展功能,可帮助康涅狄格州立大学的学生选择时间表。 ...该扩展程序然后显示一个新页面,其中显示可用的课程表,确保不存在时间冲突。 然后,学生可以通过选择包括或排除课程的特定...

    CourseSchedule:软件项目挑战

    课程时间表 열어버렸네제인데인데로열어버렸네? 내버린로보보다?...如果在Schedule中插入更多属性或删除某些现有属性,则还需要修改ScheduleList和gui Schedule I / O Form(如ScheduleTable和InputPanel)。

    schedule_demo(c#版本)

    例如,我们可以使用`List&lt;Course&gt;`来存储多个课程对象,其中`Course`是自定义的课程类。 3. 枚举(Enum):我们可以用枚举来定义课程的类型(如数学、英语、体育等),这样可以提供更好的代码可读性和类型安全性。 ...

    course-table源码

    "course-table源码"是一个专为Android平台设计的项目,主要功能是实现课程表的展示与管理。这个源码提供了一个很好的示例,对于想要学习Android应用开发,特别是对UI设计和数据管理感兴趣的开发者来说,这是一个值得...

    Course Schedule Generator-开源

    完成的项目。 有些功能并不完全智能,但它们可以工作。 如果它阻止使用程序,请报告错误。 该程序是完全开源的,并使用诺基亚 qt [http://qt.nokia.com/] 制作。 联系以获取更多信息或问题。

    leetcode卡-leet-code-may-challenge:包含对MayChallenge(LeetCode)上发布的问题的解决方案。

    3. 图论:如“Course Schedule II”可能涉及拓扑排序和深度优先搜索。 4. 字符串处理:如“Valid Palindrome II”要求实现字符串的双指针法或者动态规划解决。 5. 排序与搜索:比如“Search in Rotated Sorted Array...

    lrucacheleetcode-leetcode-java:力码研究

    Course Schedule II**:这个问题可以通过模拟LRU缓存来解决,其中每个课程代表一个元素,课程的依赖关系决定了元素的使用顺序。 2. **146. LRU Cache**:这是一个直接要求实现LRU缓存的题目,是理解LRU机制的好例子...

    PeopleSoft Course Schedule Export-crx插件

    语言:English 一键导出课程表,并在PeopleSoft网站上提供有用的快捷方式 功能此扩展可帮助学生有效地跟踪他们的课程,最大程度地减少混乱和错过的课程。 它与学校的课程选择网站集成,自动将课程信息解析为重复的...

    ScheduleViz: Course Schedule Plannner-开源

    **ScheduleViz:开源课程日程规划器** ScheduleViz是一个专为大学学生和教育机构设计的开源项目,它提供了一个交互式的、基于时间表数据的课程安排工具。这款工具利用Perl CGI(Common Gateway Interface)脚本来...

    Pretty UW Course Schedule-crx插件

    语言:English 美化UWaterloo课程表页面! 一个简单的Chrome扩展程序,改善了滑铁卢大学课程表页面的外观。 1.0.7中的新增功能:*扩展名将在新的课程表URL(classes.uwaterloo.ca)上激活。功能包括:*重组的课程搜索...

    javalruleetcode-leetcode:leetcode

    Course Schedule II`(课程表II)、`202. Happy Number`(快乐数)、`146. LRU Cache`(LRU 缓存机制)等。 4. **LRUCache 应用场景**: - 在数据库查询优化中,LRUCache 用于缓存最近查询过的数据,减少对数据库...

    javalruleetcode-LeetCode-Solutions:LeetCode-解决方案

    Course Schedule II" 和 "146. LRU Cache"。这些问题要求我们设计并实现一个高效的缓存机制,LRU Cache 是理想的解决方案。通过分析和解答这些题目,我们可以加深对 LRUCache 工作原理的理解,并提升 Java 编程技巧...

    lrucacheleetcode-Algorithms:个人学习笔记

    Course Schedule II`、`212. Word Search II`以及著名的`146. LRU Cache`。这些问题可以帮助理解LRU的工作原理,并锻炼实现LRU缓存的数据结构和算法能力。 6. **应用**: - LRU缓存广泛应用于数据库系统、操作...

    漂亮的UW课程表「Pretty UW Course Schedule」-crx插件

    改进观看滑铁卢大学课程表的页面 一个简单的Chrome扩展程序,改善了滑铁卢大学课程表页面的外观。 1.0.4中的新增功能:-在某些情况下修复了类具有“封闭部分”的表格渲染-改进了表单上最新术语的计算功能包括:*重组...

Global site tag (gtag.js) - Google Analytics