题目链接:https://leetcode.com/problems/course-schedule/
题目:
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.
click to show more hints.
Hints:
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.
Topological Sort via DFS - A great video tutorial (21 minutes) on Coursera explaining the basic concepts of Topological Sort.
Topological sort could also be done via BFS.
解题思路:
这题的考点是图的深度遍历。
需要说明的是,课程数为 2,表示课程为 0,1。即,课程数始终从 0 开始编号。
没有心情写思路了,分手的第一天。
参考链接:http://www.programcreek.com/2014/05/leetcode-course-schedule-java/
代码实现:
public class Solution {
public boolean canFinish(int numCourses, int[][] prerequisites) {
if(prerequisites == null)
return false;
int len = prerequisites.length;
if(numCourses == 0 || len == 0)
return true;
int[] visit = new int[numCourses];
// 将一个课程和其前驱放到 map 中
HashMap<Integer, ArrayList<Integer>> map = new HashMap<Integer, ArrayList<Integer>>();
for(int[] a : prerequisites) {
if(map.containsKey(a[0])) {
map.get(a[0]).add(a[1]);
} else {
ArrayList<Integer> l = new ArrayList();
l.add(a[1]);
map.put(a[0], l);
}
}
for(int i = 0; i < numCourses; i ++) {
if(!canFindDFS(visit, map, i))
return false;
}
return true;
}
boolean canFindDFS(int[] visit, HashMap<Integer, ArrayList<Integer>> map, int i) {
if(visit[i] == -1) // 正在被访问visited
return false;
if(visit[i] == 1) // 已访问过,且其后继没有环
return true;
visit[i] = -1;
if(map.containsKey(i)) {
for(Integer k : map.get(i)) {
if(!canFindDFS(visit, map, k))
return false;
}
}
visit[i] = 1;
return true;
}
}
35 / 35 test cases passed.
Status: Accepted
Runtime: 11 ms