Question 2 Course Schedule II
Compare the previous question
刚才是问存不存在一个valid topological sort: 这个follow up是问我们一个具体的一个valid topological sort
public int[] findOrder(int numCourses, int[][] [rerequisites) {}
定义method是面试里的一个步骤,candidate有权利也应该自己定义自己的API
写代码
解释代码第一步就是解释和定义
函数前面input + output + function能做什么
请定义对自己最有利的定义,比如
如果面试过说了,图可以自己定义形式
return type自己想OJ上的return有时候是故意制造麻烦
```java
```java
/*
clarification:
assumption:
high level:
- graph problem, topological order problem, bfs/ dfs
middle level:
dfs
- build graph, graph <vertex, list<neighborr>> , a-> b, b depends on a?
- dfs建图需要倒着建图,是因为打印的问题
*/
class Solution {
private boolean isCycle = false;
public int[] findOrder(int numCourses, int[][] prerequisites) {
// sanity check
// initial & build graph
List<Integer> result = new ArrayList<>();
int[] inDegree = new int[numCourses];
Map<Integer, Set<Integer>> graph = buildGraph(numCourses, prerequisites, inDegree);
// dfs& bfs
Set<Integer> visited = new HashSet<>();
Set<Integer> visiting = new HashSet<>();
for (int i = 0; i < numCourses; i++) {
dfs(graph, visited, visiting, result, i);
}
// bfs(graph, result, numCourses, inDegree);
// is cycle?
if (isCycle == true) {
return new int[]{};
}
// return value
int[] ret = new int[numCourses];
for (int i = 0; i < result.size(); i++) {
ret[result.size()- i -1] = result.get(i); // for dfs
// ret[i] = result.get(i); // for bfs
}
return ret;
}
private void bfs(Map<Integer, Set<Integer>> graph, List<Integer> result, int numCourses, int[] inDegree){
Deque<Integer> queue = new ArrayDeque<>();
for (int i = 0; i < numCourses; i++) {
if (inDegree[i] == 0) {
queue.offer(i);
}
}
int count = 0;
while (!queue.isEmpty()) {
int size = queue.size();
for (int i = 0; i < size; i++) {
Integer cur = queue.poll();
result.add(cur);
count++;
for (Integer nei: graph.getOrDefault(cur, new HashSet<>())) {
inDegree[nei]--;
if (inDegree[nei] == 0) {
queue.offer(nei);
}
}
}
}
if (count != numCourses) {
isCycle = true;
}
}
private void dfs(Map<Integer, Set<Integer>> graph, Set<Integer> visited, Set<Integer> visiting, List<Integer> result, int vertex){
if (visiting.contains(vertex)) {
isCycle = true;
return;
}
if (visited.contains(vertex)) {
return;
}
visiting.add(vertex);
for (Integer nei: graph.get(vertex)) {
dfs(graph, visited, visiting, result, nei);
}
visiting.remove(vertex);
visited.add(vertex);
result.add(vertex);
}
private Map<Integer, Set<Integer>> buildGraph(int numCourse, int[][] prerequisites, int[] inDegree) {
Map<Integer, Set<Integer>> graph = new HashMap<>();
for (int i = 0; i < numCourse; i++) {
graph.putIfAbsent(i , new HashSet<>());
}
for (int[] pre: prerequisites) {
int first = pre[1];
int second = pre[0];
graph.get(first).add(second); // pre[0] 是后修课,pre[1]是先修课
inDegree[second]++;
}
return graph;
}
}
```
More interesting implement could be seen in previous 基本功和母体
Last updated