All Downloads are FREE. Search and download functionalities are using the official Maven repository.

g0201_0300.s0207_course_schedule.Solution Maven / Gradle / Ivy

There is a newer version: 1.38
Show newest version
package g0201_0300.s0207_course_schedule;

// #Medium #Top_100_Liked_Questions #Top_Interview_Questions #Depth_First_Search
// #Breadth_First_Search #Graph #Topological_Sort #Big_O_Time_O(N)_Space_O(N)
// #2022_06_28_Time_3_ms_(97.58%)_Space_48.2_MB_(49.51%)

import java.util.ArrayList;

/**
 * 207 - Course Schedule\.
 *
 * Medium
 *
 * 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.
 *
 * *   For example, the pair `[0, 1]`, indicates that to take course `0` you have to first take course `1`.
 *
 * Return `true` if you can finish all courses. Otherwise, return `false`.
 *
 * **Example 1:**
 *
 * **Input:** numCourses = 2, prerequisites = \[\[1,0]]
 *
 * **Output:** true
 *
 * **Explanation:** There are a total of 2 courses to take. To take course 1 you should have finished course 0. So it is possible. 
 *
 * **Example 2:**
 *
 * **Input:** numCourses = 2, prerequisites = \[\[1,0],[0,1]]
 *
 * **Output:** false
 *
 * **Explanation:** There are a total of 2 courses to take. To take course 1 you should have finished course 0, and to take course 0 you should also have finished course 1. So it is impossible. 
 *
 * **Constraints:**
 *
 * *   1 <= numCourses <= 105
 * *   `0 <= prerequisites.length <= 5000`
 * *   `prerequisites[i].length == 2`
 * *   0 <= ai, bi < numCourses
 * *   All the pairs prerequisites[i] are **unique**.
**/
@SuppressWarnings("unchecked")
public class Solution {
    private static final int WHITE = 0;
    private static final int GRAY = 1;
    private static final int BLACK = 2;

    public boolean canFinish(int numCourses, int[][] prerequisites) {
        ArrayList[] adj = new ArrayList[numCourses];
        for (int i = 0; i < numCourses; i++) {
            adj[i] = new ArrayList<>();
        }
        for (int[] pre : prerequisites) {
            adj[pre[1]].add(pre[0]);
        }
        int[] colors = new int[numCourses];
        for (int i = 0; i < numCourses; i++) {
            if (colors[i] == WHITE && !adj[i].isEmpty() && hasCycle(adj, i, colors)) {
                return false;
            }
        }
        return true;
    }

    private boolean hasCycle(ArrayList[] adj, int node, int[] colors) {
        colors[node] = GRAY;
        for (int nei : adj[node]) {
            if (colors[nei] == GRAY) {
                return true;
            }
            if (colors[nei] == WHITE && hasCycle(adj, nei, colors)) {
                return true;
            }
        }
        colors[node] = BLACK;
        return false;
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy