leetcode-207. Course Schedule

原创 2016年08月30日 23:15:52

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?

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 it is possible.

2, [[1,0],[0,1]]

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.

Note:

The input prerequisites is a graph represented by a list of edges, not adjacency matrices. Read more about how a graph is represented.

Hints:

  1. This problem is equivalent to finding if a cycle exists in a directed graph. If a cycle exists, no topological ordering exists and therefore it will be impossible to take all courses.
  2. Topological Sort via DFS - A great video tutorial (21 minutes) on Coursera explaining the basic concepts of Topological Sort.
  3. Topological sort could also be done via BFS.
题意解析:

这道题就是说有一堆课程,有的课程有先修课程,比如说修A之前要修B,然后让你判断,能不能修完这些课程。下面的note是说,给你的先修课程是以边列表呈现的,而不是邻接矩阵,我们可以注意到题目给我们的是一个二维数组,也就是说[[1,0]],表示的是修1之前要修0。

这道题是典型的拓扑排序。原理也很简单,在一个有向图中,每次找到一个没有前驱节点的节点(也就是入度为0的节点),然后把它指向其他节点的边都去掉,重复这个过程(BFS),直到所有节点已被找到,或者没有符合条件的节点(如果图中有环存在)。这些下面的提示其实也告诉你了。DFS或者BFS都可以。DFS代码如下:

public class Solution {
    public boolean canFinish(int numCourses, int[][] prereq) {
        int[] visited = new int[numCourses];
        
        //courses that would have the dependency graph
        List<List<Integer>> courses = new ArrayList<List<Integer>>();
        
        for(int i=0;i<numCourses;i++){
            courses.add(new ArrayList<Integer>());
        }
        
        //add dependencies
        for(int i=0;i< prereq.length;i++){
            // for a course, add all the courses that are dependent on it
            courses.get(prereq[i][1]).add(prereq[i][0]);
        }
        
        for(int i=0;i<numCourses;i++){
            if(visited[i]==0){
                if(!dfs(i,courses,visited)) return false;
            }
        }
        return true;

    }
    
    public boolean dfs(int i,List<List<Integer>> courses, int[]visited){
        visited[i] = 1;
        
        // these are all the courses which are eligible
        //when we take their prerequisite, which is course i
        List<Integer> eligibleCourses = courses.get(i);
        
        for(int j=0;j<eligibleCourses.size();j++){
            int eligibleCourse = eligibleCourses.get(j);
            //it is already visited, during previous dfs call, so its a cycle 
            if(visited[eligibleCourse] == 1) return false;
            if(visited[eligibleCourse] == 2) continue;
               if(!dfs(eligibleCourse,courses,visited)){
                    return false;
                } 
        }
        
        //it is totally complete and no cycle found in its depth first traversal
        visited[i] = 2;
        return true;
        
        
    }
}
这段代码并不是我写的,而是discuss上找到的一个非常高效的算法。我自己写的BFS只打败了70,这个打败了95,所以就不献丑了。



算法练习(27):Course Schedule

题意:给出有向图,判断是否有环 分析与思路:题目看上去简单,但是没有一个套路还是挺难想的,求有向图是否有环,有一个思路清晰又实用的方法,就是用dfs遍历同时判断是否有回边,pre[node]和pos...
  • KingsonYing
  • KingsonYing
  • 2017年12月07日 23:30
  • 14

拓扑排序:课程表Course Schedule

There are a total of n courses you have to take, labeled from 0 to n - 1.Some courses may have prere...
  • gao1440156051
  • gao1440156051
  • 2016年05月31日 16:28
  • 686

图的深度广度搜索简单训练:Course Schedule

先看题目: There are a total of n courses you have to take, labeled from 0 to n - 1. Some courses may ...
  • Ray_sysu
  • Ray_sysu
  • 2017年03月20日 11:18
  • 127

算法练习(28):Course Schedule II

题意:给出有向图,找出它的拓扑排序 分析与思路:同样还是Course Schedule I(上一个博客)的思路,只不过在每次访问完一个结点的时候把它push起来,为什么呢?因为拓扑排序实际上就是结点...
  • KingsonYing
  • KingsonYing
  • 2017年12月08日 00:16
  • 32

算法课第十八周作业 | Course Schedule II

写在前面: 下周要考试了,紧张!赶紧复习一下考试要点。选取题目210,是第四周做的那道的升级版,练练手。 题意解读: 给定numCourses个课程以及课程的学习次序对集合,【0,1】代表需先学完...
  • zsrose
  • zsrose
  • 2017年06月25日 12:38
  • 67

JAVA学习代码——集合版选课

封装学生类:Student.java package 集合_学生选课; import java.util.HashSet; import java.util.Set; /** * 学生类 ...
  • Reserved_person
  • Reserved_person
  • 2016年08月12日 21:24
  • 489

算法课第3周第2题——207. Course Schedule

题目描述: There are a total of n courses you have to take, labeled from 0 to n - 1. Some cours...
  • bwstardust
  • bwstardust
  • 2017年03月12日 03:56
  • 104

【LeetCode】207. Course Schedule判断有向图是否有环

1、问题描述输入:n, [[1,0], [2,1], …., [n, n-1], [0,1], …..],假设没有重复的边 n表示总共0~n-1门课程,即n个节点 [1,0]表示先上课程0,才能上...
  • myangel_xy
  • myangel_xy
  • 2017年05月29日 10:03
  • 173

判断有向图是否有环之拓扑排序-LeetCode 207. Course Schedule

拓扑排序:对一个有向无环图(Directed Acyclic Graph简称DAG)G进行拓扑排序,是将G中所有顶点排成一个线性序列,使得图中任意一对顶点u和v,若边(u,v)∈E(G),则u在线性...
  • mengmee_pku
  • mengmee_pku
  • 2016年05月03日 15:44
  • 2216

spring中schedule注解的使用

版权声明:本文为博主原创文章,未经博主允许不得转载。 以前框架使用quartz框架执行定时调度问题、 老大说这配置太麻烦、每个调度都需要多加在spring的配置中、 能不能减...
  • yinbucheng
  • yinbucheng
  • 2017年02月15日 10:18
  • 797
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:leetcode-207. Course Schedule
举报原因:
原因补充:

(最多只允许输入30个字)