您的位置:首页 > 其它

207 Course Schedule

2016-02-13 15:57 375 查看
题目链接: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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: