207. Course Schedule 210. Course Schedule II

拓扑排序的问题

套路:

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);
    }
扫描二维码关注公众号,回复: 2901125 查看本文章

基本同理做 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];
    }

猜你喜欢

转载自www.cnblogs.com/HUTONG749/p/9541840.html