题目地址:
leetcode.com/problems/co…
import java.util.*;
public class Solution {
public int[] findOrder(int numCourses, int[][] prerequisites) {
int[] res = new int[numCourses];
if (prerequisites == null || prerequisites.length == 0) {
for (int i = 0; i < numCourses; i++) {
res[i] = i;
}
return res;
}
Map<Integer, List<Integer>> graph = buildGraph(prerequisites);
int[] indegrees = new int[numCourses];
for (int[] prerequisite : prerequisites) {
indegrees[prerequisite[0]]++;
}
Queue<Integer> queue = new LinkedList<>();
for (int i = 0; i < indegrees.length; i++) {
if (indegrees[i] == 0) {
queue.offer(i);
}
}
int idx = 0;
while (!queue.isEmpty()) {
int cur = queue.poll();
res[idx++] = cur;
if (graph.containsKey(cur)) {
for (int next : graph.get(cur)) {
indegrees[next]--;
if (indegrees[next] == 0) {
queue.offer(next);
}
}
}
}
return idx != numCourses ? new int[0] : res;
}
private Map<Integer, List<Integer>> buildGraph(int[][] prerequisites) {
Map<Integer, List<Integer>> map = new HashMap<>();
for (int[] prerequisite : prerequisites) {
map.putIfAbsent(prerequisite[1], new ArrayList<>());
map.get(prerequisite[1]).add(prerequisite[0]);
}
return map;
}
}
import java.util.*;
public class Solution {
public int[] findOrder(int numCourses, int[][] prerequisites) {
int[] res = new int[numCourses];
if (prerequisites == null || prerequisites.length == 0) {
for (int i = 0; i < numCourses; i++) {
res[i] = i;
}
return res;
}
Map<Integer, List<Integer>> graph = buildGraph(prerequisites);
Deque<Integer> stack = new LinkedList<>();
int[] visited = new int[numCourses];
Arrays.fill(visited, -1);
for (int i = 0; i < numCourses; i++) {
if (visited[i] == -1) {
if (dfs(i, graph, visited, stack)) {
return new int[0];
}
}
}
int idx = 0;
while (!stack.isEmpty()) {
res[idx++] = stack.pop();
}
return res;
}
private boolean dfs(int cur, Map<Integer, List<Integer>> graph, int[] visited, Deque<Integer> stack) {
visited[cur] = 0;
if (graph.containsKey(cur)) {
for (int next : graph.get(cur)) {
if (visited[next] == 0) {
return true;
} else if (visited[next] == -1) {
if (dfs(next, graph, visited, stack)) {
return true;
}
}
}
}
visited[cur] = 1;
stack.push(cur);
return false;
}
private Map<Integer, List<Integer>> buildGraph(int[][] prerequisites) {
Map<Integer, List<Integer>> map = new HashMap<>();
for (int[] prerequisite : prerequisites) {
map.putIfAbsent(prerequisite[1], new ArrayList<>());
map.get(prerequisite[1]).add(prerequisite[0]);
}
return map;
}
}