Course Schedule II 08/04
Example
先通过hashmap建立有向图的映射,key是先修课
,value是要上的课,那么就会形成由先修课指向要上的课的有向图,那么现在要上
的课,可以看做是他图里的邻居,有in come edge的,然后建立统计他们income
edge的map,然后做bfs。public class Solution {
/*
* @param numCourses: a total of n courses
* @param prerequisites: a list of prerequisite pairs
* @return: the course order
*/
public int[] findOrder(int numCourses, int[][] prerequisites) {
// write your code here
int[] res = new int[numCourses];
if(prerequisites == null || numCourses == 0){
return res;
}
HashMap<Integer, List<Integer>> map = buildGraph(numCourses,prerequisites);
HashMap<Integer,Integer> degreeMap = new HashMap<>();
for(int i = 0; i < numCourses; i++){
for(Integer n : map.get(i)){
if(degreeMap.containsKey(n)){
degreeMap.put(n,degreeMap.get(n)+1);
}else{
degreeMap.put(n,1);
}
}
}
Queue<Integer> queue = new LinkedList<>();
List<Integer> list = new ArrayList<>();
for(int i = 0; i < numCourses; i++){
if(!degreeMap.containsKey(i)){
queue.offer(i);
list.add(i);
}
}
while(!queue.isEmpty()){
int n = queue.poll();
for(Integer k : map.get(n)){
degreeMap.put(k,degreeMap.get(k)-1);
if(degreeMap.get(k) == 0){
queue.offer(k);
list.add(k);
}
}
}
if(list.size()!= numCourses){
return new int[0];
}else{
for(int i = 0; i < list.size();++i){
res[i] = list.get(i);
}
return res;
}
}
public HashMap<Integer,List<Integer>> buildGraph(int numCourses,int[][] prerequisites){
HashMap<Integer,List<Integer>> map = new HashMap<>();
for (int i = 0; i < numCourses ;i++ ){
map.put(i,new ArrayList<>());
}
for(int i = 0; i < prerequisites.length;++i){
int cur = prerequisites[i][0];
int pre = prerequisites[i][1];
map.get(pre).add(cur);
}
return map;
}
}Last updated