Advertisement
1988coder

207. Course Schedule

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