Advertisement
1988coder

210. Course Schedule II

Jan 16th, 2019
138
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 4.49 KB | None | 0 0
  1.  
  2. // LeetCode URL: https://leetcode.com/problems/course-schedule-ii/
  3. import java.util.HashMap;
  4. import java.util.HashSet;
  5. import java.util.LinkedList;
  6. import java.util.Queue;
  7. import java.util.Stack;
  8.  
  9. /**
  10.  * Using DFS
  11.  *
  12.  * Time Complexity: O(Vertices + Edges) = O(N + P).
  13.  *
  14.  * Space Complexity: O(Vertices + Edges) = O(N + P).
  15.  *
  16.  * In worst case (in DAG) P = N * (N - 1) / 2. Thus worst case complexity:
  17.  * O(N^2). Refer: https://stackoverflow.com/a/11699123
  18.  *
  19.  * N = Number of Courses or Number of vertices. P = Number of prerequisites or
  20.  * Number of edges.
  21.  */
  22. class Solution1 {
  23.     public int[] findOrder(int numCourses, int[][] prerequisites) {
  24.         if (numCourses == 0) {
  25.             return new int[0];
  26.         }
  27.  
  28.         int[] result = new int[numCourses];
  29.  
  30.         if (numCourses == 1) {
  31.             return result;
  32.         }
  33.  
  34.         HashMap<Integer, HashSet<Integer>> graph = buildGraph(prerequisites, numCourses);
  35.         HashSet<Integer> visited = new HashSet<>();
  36.         HashSet<Integer> visiting = new HashSet<>();
  37.         Stack<Integer> order = new Stack<>();
  38.  
  39.         for (int i = 0; i < numCourses; i++) {
  40.             if (!visited.contains(i) && hasCycle(graph, i, visited, visiting, order)) {
  41.                 return new int[0];
  42.             }
  43.         }
  44.  
  45.         int i = 0;
  46.         while (!order.isEmpty()) {
  47.             result[i] = order.pop();
  48.             i++;
  49.         }
  50.  
  51.         return result;
  52.     }
  53.  
  54.     private HashMap<Integer, HashSet<Integer>> buildGraph(int[][] prerequisites, int numCourses) {
  55.         HashMap<Integer, HashSet<Integer>> graph = new HashMap<>();
  56.         for (int i = 0; i < numCourses; i++) {
  57.             graph.put(i, new HashSet<>());
  58.         }
  59.         if (prerequisites == null || prerequisites.length == 0) {
  60.             return graph;
  61.         }
  62.  
  63.         for (int[] p : prerequisites) {
  64.             graph.get(p[1]).add(p[0]);
  65.         }
  66.         return graph;
  67.     }
  68.  
  69.     private boolean hasCycle(HashMap<Integer, HashSet<Integer>> graph, int node, HashSet<Integer> visited,
  70.             HashSet<Integer> visiting, Stack<Integer> order) {
  71.         if (visited.contains(node)) {
  72.             return false;
  73.         }
  74.         if (visiting.contains(node)) {
  75.             return true;
  76.         }
  77.  
  78.         visiting.add(node);
  79.  
  80.         for (int n : graph.get(node)) {
  81.             if (!visited.contains(n) && hasCycle(graph, n, visited, visiting, order)) {
  82.                 return true;
  83.             }
  84.         }
  85.  
  86.         visiting.remove(node);
  87.         visited.add(node);
  88.         order.push(node);
  89.         return false;
  90.     }
  91. }
  92.  
  93. /**
  94.  * Using BFS
  95.  *
  96.  * Time Complexity: O(Vertices + Edges) = O(N + P).
  97.  *
  98.  * Space Complexity: O(Vertices + Edges) = O(N + P).
  99.  *
  100.  * In worst case (in DAG) P = N * (N - 1) / 2. Thus worst case complexity:
  101.  * O(N^2). Refer: https://stackoverflow.com/a/11699123
  102.  *
  103.  * N = Number of Courses or Number of vertices. P = Number of prerequisites or
  104.  * Number of edges.
  105.  */
  106. class Solution2 {
  107.     public int[] findOrder(int numCourses, int[][] prerequisites) {
  108.         if (numCourses == 0) {
  109.             return new int[0];
  110.         }
  111.  
  112.         int[] result = new int[numCourses];
  113.  
  114.         if (numCourses == 1) {
  115.             return result;
  116.         }
  117.  
  118.         HashMap<Integer, HashSet<Integer>> graph = new HashMap<>();
  119.         int[] inDegree = new int[numCourses];
  120.         buildGraph(numCourses, prerequisites, graph, inDegree);
  121.  
  122.         Queue<Integer> queue = new LinkedList<>();
  123.         for (int i = 0; i < numCourses; i++) {
  124.             if (inDegree[i] == 0) {
  125.                 queue.offer(i);
  126.             }
  127.         }
  128.  
  129.         int count = 0;
  130.  
  131.         while (!queue.isEmpty()) {
  132.             int course = queue.poll();
  133.             result[count] = course;
  134.             count++;
  135.             for (int n : graph.get(course)) {
  136.                 inDegree[n]--;
  137.                 if (inDegree[n] == 0) {
  138.                     queue.offer(n);
  139.                 }
  140.             }
  141.         }
  142.  
  143.         return count == numCourses ? result : new int[0];
  144.     }
  145.  
  146.     private void buildGraph(int numCourses, int[][] prerequisites, HashMap<Integer, HashSet<Integer>> graph,
  147.             int[] inDegree) {
  148.         for (int i = 0; i < numCourses; i++) {
  149.             graph.put(i, new HashSet<>());
  150.         }
  151.         if (prerequisites == null || prerequisites.length == 0) {
  152.             return;
  153.         }
  154.         for (int[] p : prerequisites) {
  155.             graph.get(p[1]).add(p[0]);
  156.             inDegree[p[0]]++;
  157.         }
  158.     }
  159. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement