拓扑排序的问题
套路:
1. 初始化所有的节点的入度为零。
2. 遍历给定的输入要求。 维护一个indegree 的表。记录每个节点的入度。 维护map, 每个节点的后续节点
3. 得到这两个表以后开始用queue遍历所有入度为零的点。
4. **如何判断最终结果?
由于我们开始初始化了所有节点入度为0,所以在用queue遍历所有节点的时候。一定会遍历所有可能的节点。(哪怕有些节点在输入要求根本没有出现。他们的入度会保持为0)
所以只需要比较遍历的节点和indegree的大小,便可知道是否所有数据最终的入度都是0了。
**因为进入queu遍历的节点的入度肯定为0
public boolean canFinish(int numCourses, int[][] prerequisites) { //build indegree map Map<Integer, Integer> indegree = new HashMap<>(); Map<Integer, Set<Integer>> request = new HashMap<>(); for(int i = 0; i < numCourses; ++i){ indegree.putIfAbsent(i, 0); } for(int i = 0; i < prerequisites.length;++i){ int pre = prerequisites[i][0]; int next = prerequisites[i][1]; request.putIfAbsent(pre, new HashSet<Integer>()); Set<Integer> set = request.get(pre); if(!set.contains(next)){ set.add(next); indegree.put(next, indegree.get(next) +1); } } // travers the indegree map Queue<Integer> queue = new LinkedList<>(); for(Integer i : indegree.keySet()){ if(indegree.get(i) == 0){ queue.offer(i); } } int num = 0; while(!queue.isEmpty()){ Integer current = queue.poll(); num ++; if(request.get(current) == null) continue; for(Integer i : request.get(current)){ indegree.put(i, indegree.get(i)-1); if(indegree.get(i) == 0){ queue.offer(i); } } } return (num == numCourses); }
基本同理做 course schedule ii
这里把indegree改成了一个int[]
public int[] findOrder(int numCourses, int[][] prerequisites) { int[] indegree = new int[numCourses]; Map<Integer, Set<Integer>> request = new HashMap<>(); for(int i = 0; i < prerequisites.length;++i){ int pre = prerequisites[i][1]; int next = prerequisites[i][0]; request.putIfAbsent(pre, new HashSet<Integer>()); Set<Integer> set = request.get(pre); if(!set.contains(next)){ set.add(next); indegree[next]++; } } // travers the indegree map Queue<Integer> queue = new LinkedList<>(); for(int i =0 ; i < numCourses; ++i){ if(indegree[i] == 0){ queue.offer(i); } } int[] order = new int[numCourses]; int num = 0; while(!queue.isEmpty()){ Integer current = queue.poll(); order[num++] = current; if(request.get(current) == null) continue; for(Integer i : request.get(current)){ indegree[i]--; if(indegree[i] == 0){ queue.offer(i); } } } if (num == numCourses) return order; return new int[0]; }