210. Course Schedule II

Difficulty:
Related Topics:
    Similar Questions:

      Problem

      There are a total of numCourses courses you have to take, labeled from 0 to numCourses - 1. You are given an array prerequisites where prerequisites[i] = [ai, bi] indicates that you must take course bi first if you want to take course ai.

      Example 1: 

      Input: numCourses = 2, prerequisites = [[1,0]]
      Output: [0,1]
      Explanation: There are a total of 2 courses to take. To take course 1 you should have finished course 0. So the correct course order is [0,1].
      

      **Example 2: **

      Input: numCourses = 4, prerequisites = [[1,0],[2,0],[3,1],[3,2]]
      Output: [0,2,1,3]
      Explanation: There are a total of 4 courses to take. To take course 3 you should have finished both courses 1 and 2. Both courses 1 and 2 should be taken after you finished course 0.
      So one correct course order is [0,1,2,3]. Another correct ordering is [0,2,1,3].
      

      **Example 3: **

      Input: numCourses = 1, prerequisites = []
      Output: [0]
      

      **Constraints: **

      Solution (Java)

      class Solution {
          public int[] findOrder(int numCourses, int[][] prerequisites) {
              Map<Integer, List<Integer>> graph = new HashMap<>();
              for (int i = 0; i < numCourses; i++) {
                  graph.put(i, new ArrayList<>());
              }
              for (int[] classes : prerequisites) {
                  graph.get(classes[0]).add(classes[1]);
              }
              List<Integer> output = new ArrayList<>();
              Map<Integer, Boolean> visited = new HashMap<>();
              for (int c : graph.keySet()) {
                  if (dfs(c, graph, visited, output)) {
                      return new int[0];
                  }
              }
              int[] res = new int[output.size()];
              for (int i = 0; i < output.size(); i++) {
                  res[i] = output.get(i);
              }
              return res;
          }
      
          private boolean dfs(
                  int course,
                  Map<Integer, List<Integer>> graph,
                  Map<Integer, Boolean> visited,
                  List<Integer> output) {
              if (visited.containsKey(course)) {
                  return visited.get(course);
              }
              visited.put(course, true);
              for (int c : graph.get(course)) {
                  if (dfs(c, graph, visited, output)) {
                      return true;
                  }
              }
              visited.put(course, false);
              output.add(course);
              return false;
          }
      }
      

      Solution (Javascript)

      /**
       * @param {number} numCourses
       * @param {number[][]} prerequisites
       * @return {number[]}
       */
      var findOrder = function(numCourses, prerequisites) {
          // Initialize result array
          const result = new Array(numCourses).fill(0)
          const inDegree = new Array(numCourses).fill(0);
      
          for(const pre of prerequisites) {
              inDegree[pre[0]]++
          }
      
          const zeroDegree = [];
      
          for(let i = 0; i < numCourses; i++) {
              if(inDegree[i]===0) {
                  zeroDegree.push(i);
              }
          }
      
          // Topological sort not possible
          if(zeroDegree.length === 0) return []
      
          let i = 0
          while(zeroDegree.length) {
              const course = zeroDegree.pop()
              // Add course to the result array 
              result[i++] = course
              for(const pre of prerequisites) {
                  if(course === pre[1]) {
                      inDegree[pre[0]]--
                      if(inDegree[pre[0]]===0) {
                          zeroDegree.push(pre[0])
                      }
                  }
              }
          }
      
          // Topological sort not possible
          for(const num of inDegree) {
              if(num!== 0) return []
          }
      
          return result;
      };
      

      Explain:

      nope.

      Complexity: