Skip to content

207. Course Schedule #12

Open
Open
@LLancelot

Description

@LLancelot

Description

There are a total of numCourses courses you have to take, labeled from 0 to numCourses-1.

Some courses may have prerequisites, for example to take course 0 you have to first take course 1, which is expressed as a pair: [0,1]

Given the total number of courses and a list of prerequisite pairs, is it possible for you to finish all courses?

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:

  • The input prerequisites is a graph represented by a list of edges, not adjacency matrices. Read more about how a graph is represented.
  • You may assume that there are no duplicate edges in the input prerequisites.
  • 1 <= numCourses <= 10^5

DFS

class Solution {    
    public boolean canFinish(int N, int[][] preqs) {        
        ArrayList[] G = new ArrayList[N];
        for (int i = 0; i < N; i++) {
            G[i] = new ArrayList();       
        }
        
        for (int i = 0; i < preqs.length; i++) {
            G[preqs[i][1]].add(preqs[i][0]);    // G[1]=[0, 2, ...]把1的先修课加到集合里
        }
        
        boolean[] visited = new boolean[N];
        
        for (int course_idx = 0; course_idx < N; course_idx++) {
            if (!dfs(G, visited, course_idx)) {
                return false;
            }
        }
    
        return true;
    }
    
    private boolean dfs(ArrayList[] G, boolean[] visited, int course) {
        if (visited[course] == true)
            return false;
        
        visited[course] = true;
        
        for (int i = 0; i < G[course].size(); i++) {
            if (!dfs(G, visited, (int)G[course].get(i)))
                return false;
        }
        
        visited[course] = false;
        return true;
    }
}

Metadata

Metadata

Assignees

No one assigned

    Labels

    BFSDFSdfs questions

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions