|
1 |
| -from collections import defaultdict, deque |
| 1 | +# Time: O(|V| + |E|) |
| 2 | +# Space: O(|E|) |
2 | 3 |
|
| 4 | +import collections |
3 | 5 |
|
| 6 | + |
| 7 | +# bfs solution |
4 | 8 | class Solution(object):
|
5 | 9 | def findOrder(self, numCourses, prerequisites):
|
6 | 10 | """
|
7 | 11 | :type numCourses: int
|
8 | 12 | :type prerequisites: List[List[int]]
|
9 | 13 | :rtype: List[int]
|
10 | 14 | """
|
11 |
| - res, zero_in_degree_queue = [], deque() |
12 |
| - in_degree, out_degree = defaultdict(set), defaultdict(set) |
13 |
| - |
| 15 | + indegree = collections.defaultdict(set) |
| 16 | + outdegree = collections.defaultdict(set) |
14 | 17 | for i, j in prerequisites:
|
15 |
| - in_degree[i].add(j) |
16 |
| - out_degree[j].add(i) |
17 |
| - |
18 |
| - for i in xrange(numCourses): |
19 |
| - if i not in in_degree: |
20 |
| - zero_in_degree_queue.append(i) |
21 |
| - |
22 |
| - while zero_in_degree_queue: |
23 |
| - prerequisite = zero_in_degree_queue.popleft() |
24 |
| - res.append(prerequisite) |
25 |
| - |
26 |
| - if prerequisite in out_degree: |
27 |
| - for course in out_degree[prerequisite]: |
28 |
| - in_degree[course].discard(prerequisite) |
29 |
| - if not in_degree[course]: |
30 |
| - zero_in_degree_queue.append(course) |
31 |
| - |
32 |
| - del out_degree[prerequisite] |
33 |
| - |
34 |
| - if out_degree: |
35 |
| - return [] |
36 |
| - |
37 |
| - return res |
| 18 | + indegree[i].add(j) |
| 19 | + outdegree[j].add(i) |
| 20 | + q = collections.deque([i for i in xrange(numCourses) if i not in indegree]) |
| 21 | + result = [] |
| 22 | + while q: |
| 23 | + node = q.popleft() |
| 24 | + result.append(node) |
| 25 | + for i in outdegree[node]: |
| 26 | + indegree[i].remove(node) |
| 27 | + if not indegree[i]: |
| 28 | + q.append(i) |
| 29 | + del indegree[i] |
| 30 | + del outdegree[node] |
| 31 | + return result if not indegree and not outdegree else [] |
| 32 | + |
| 33 | + |
| 34 | +# Time: O(|V| + |E|) |
| 35 | +# Space: O(|E|) |
| 36 | +# dfs solution |
| 37 | +class Solution2(object): |
| 38 | + def findOrder(self, numCourses, prerequisites): |
| 39 | + """ |
| 40 | + :type numCourses: int |
| 41 | + :type prerequisites: List[List[int]] |
| 42 | + :rtype: List[int] |
| 43 | + """ |
| 44 | + indegree = collections.defaultdict(set) |
| 45 | + outdegree = collections.defaultdict(set) |
| 46 | + for i, j in prerequisites: |
| 47 | + indegree[i].add(j) |
| 48 | + outdegree[j].add(i) |
| 49 | + stk = [i for i in xrange(numCourses) if i not in indegree] |
| 50 | + result = [] |
| 51 | + while stk: |
| 52 | + node = stk.pop() |
| 53 | + result.append(node) |
| 54 | + for i in outdegree[node]: |
| 55 | + indegree[i].remove(node) |
| 56 | + if not indegree[i]: |
| 57 | + stk.append(i) |
| 58 | + del indegree[i] |
| 59 | + del outdegree[node] |
| 60 | + return result if not indegree and not outdegree else [] |
0 commit comments