方法1: 虽然这道题我没做出来,但是比较明显,第一想法还是bfs。详细解释直接移步lc官方解答1.复杂度没分析
class Solution {
public int[] findOrder(int numCourses, int[][] prerequisites) {
if (numCourses == 0) return null;
// Convert graph presentation from edges to indegree of adjacent list.
int indegree[] = new int[numCourses], order[] = new int[numCourses], index = 0;
for (int i = 0; i < prerequisites.length; i++) // Indegree - how many prerequisites are needed.
indegree[prerequisites[i][0]]++;
Queue<Integer> queue = new LinkedList<Integer>();
for (int i = 0; i < numCourses; i++)
if (indegree[i] == 0) {
// Add the course to the order because it has no prerequisites.
order[index++] = i;
queue.offer(i);
}
// How many courses don't need prerequisites.
while (!queue.isEmpty()) {
int prerequisite = queue.poll(); // Already finished this prerequisite course.
for (int i = 0; i < prerequisites.length; i++) {
if (prerequisites[i][1] == prerequisite) {
indegree[prerequisites[i][0]]--;
if (indegree[prerequisites[i][0]] == 0) {
// If indegree is zero, then add the course to the order.
order[index++] = prerequisites[i][0];
queue.offer(prerequisites[i][0]);
}
}
}
}
return (index == numCourses) ? order : new int[0];
}
}
方法2: dfs。这其实是一道graph题,详细解释请直接移步lc官方解答1。复杂度没分析。
class Solution {
int white = 1;
int grey = 2;
int black = 3;
boolean isPossible = true;
Map<Integer, Integer> color = new HashMap<>();
Map<Integer, List<Integer>> adjList = new HashMap<>();
Stack<Integer> stack = new Stack<>();
public int[] findOrder(int numCourses, int[][] prerequisites) {
for(int i = 0; i < numCourses; i++){
color.put(i, white);
}
for(int i = 0; i < prerequisites.length; i++){
List<Integer> list = adjList.getOrDefault(prerequisites[i][1], new ArrayList<>());
list.add(prerequisites[i][0]);
adjList.put(prerequisites[i][1], list);
}
for(int i = 0; i < numCourses; i++){
if(color.get(i) == white) dfs(i);
}
int[] res = new int[numCourses];
if(!isPossible){
return new int[0];
}else{
for(int i = 0; i < numCourses; i++){
res[i] = stack.pop();
}
}
return res;
}
public void dfs(int i){
if(!isPossible) return;
color.put(i, grey);
for(int neighbour : adjList.getOrDefault(i, new ArrayList<>())){
if(color.get(neighbour) == grey){
isPossible = false;
continue;
}else if(color.get(neighbour) == white){
dfs(neighbour);
}else if(color.get(neighbour) == black) continue;
}
color.put(i, black);
stack.push(i);
}
}
总结:
- 非常好的一道题目,融合了bfs,dfs,graph,很难,但是我觉得学到了很多。