public class Solution {
public int[] findOrder(int numCourses, int[][] prerequisites) {
int[] ret = new int[numCourses];
HashMap<Integer, HashSet<Integer>> graph = buildGraph(prerequisites);
HashMap<Integer, Integer> map = new HashMap<>();
for (Integer node : graph.keySet()) {
for (Integer neighbor : graph.get(node)) {
if (map.containsKey(neighbor)) {
map.put(neighbor, map.get(neighbor)+1);
} else {
map.put(neighbor, 1);
}
}
}
Queue<Integer> queue = new LinkedList<>();
HashSet<Integer> set = new HashSet<>();
for (int i=0; i<numCourses; i++) {
if (!map.containsKey(i)) {
queue.offer(i);
set.add(i);
}
}
int count = 0;
while (!queue.isEmpty()) {
Integer node = queue.poll();
ret[count++] = node;
HashSet<Integer> neighbors = graph.get(node);
if (neighbors != null) {
for (Integer neighbor : neighbors) {
map.put(neighbor, map.get(neighbor)-1);
if (map.get(neighbor) == 0) {
queue.offer(neighbor);
set.add(neighbor);
}
}
}
}
if (count == numCourses) {
return ret;
}
return new int[]{};
}
private static HashMap<Integer, HashSet<Integer>> buildGraph(int[][] prerequisites) {
HashMap<Integer, HashSet<Integer>> graph = new HashMap<Integer, HashSet<Integer>>();
for (int i=0; i<prerequisites.length; i++) {
if (graph.containsKey(prerequisites[i][1])) {
graph.get(prerequisites[i][1]).add(prerequisites[i][0]);
} else {
HashSet<Integer> neighbor = new HashSet<>();
neighbor.add(prerequisites[i][0]);
graph.put(prerequisites[i][1], neighbor);
}
}
return graph;
}
}
Leetcode 210. Course Schedule II
最新推荐文章于 2021-10-13 21:54:21 发布