# Course Schedule LeetCode Solution | Easy Approach

Share:

Course Schedule 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.

### Course Schedule Solutions

Time: O(∣V∣+∣E∣), where |V| = \texttt{numCourses}∣V∣=numCourses and |E| = |\texttt{prerequisites}|∣E∣=∣prerequisites∣
Space: O(∣V∣+∣E∣), where |V| = \texttt{numCourses}∣V∣=numCourses and |E| = |\texttt{prerequisites}|∣E∣=∣prerequisites∣

### C++

`````` enum class State { INIT, VISITING, VISITED };

class Solution {
public:
bool canFinish(int numCourses, vector<vector<int>>& prerequisites) {
vector<vector<int>> graph(numCourses);
vector<State> state(numCourses);

for (const auto& p : prerequisites)
graph[p].push_back(p);

for (int i = 0; i < numCourses; ++i)
if (hasCycle(graph, i, state))
return false;

return true;
}

private:
bool hasCycle(const vector<vector<int>>& graph, int u, vector<State>& state) {
if (state[u] == State::VISITING)
return true;
if (state[u] == State::VISITED)
return false;

state[u] = State::VISITING;
for (const int v : graph[u])
if (hasCycle(graph, v, state))
return true;
state[u] = State::VISITED;

return false;
}
};``````

### Java

``````
enum State { INIT, VISITING, VISITED }

class Solution {
public boolean canFinish(int numCourses, int[][] prerequisites) {
List<Integer>[] graph = new List[numCourses];
State[] state = new State[numCourses];

for (int i = 0; i < numCourses; ++i)
graph[i] = new ArrayList<>();

for (int[] p : prerequisites)

for (int i = 0; i < numCourses; ++i)
if (hasCycle(graph, i, state))
return false;

return true;
}

private boolean hasCycle(List<Integer>[] graph, int u, State[] state) {
if (state[u] == State.VISITING)
return true;
if (state[u] == State.VISITED)
return false;

state[u] = State.VISITING;
for (final int v : graph[u])
if (hasCycle(graph, v, state))
return true;
state[u] = State.VISITED;

return false;
}
}``````

### Python

``````
from enum import Enum

class State(Enum):
INIT = 0
VISITING = 1
VISITED = 2

class Solution:
def canFinish(self, numCourses: int, prerequisites: List[List[int]]) -> bool:
graph = [[] for _ in range(numCourses)]
state = [State.INIT] * numCourses

for a, b in prerequisites:
graph[b].append(a)

def hasCycle(u: int) -> bool:
if state[u] == State.VISITING:
return True
if state[u] == State.VISITED:
return False

state[u] = State.VISITING
if any(hasCycle(v) for v in graph[u]):
return True
state[u] = State.VISITED

return False

return not any(hasCycle(i) for i in range(numCourses))``````

#### Watch Tutorial

Checkout more Solutions here