207. Course Schedule

There are a total of n courses you have to take, labeled from 0 to n-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: 2, [[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: 2, [[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.
public boolean canFinish(int n, int[][] ps) {
    int[] in = new int[n];
    HashSet<Integer>[] out = new HashSet[n];
    for(int i = 0; i < n; i++)
        out[i] = new HashSet<Integer>();
    for(int[] p : ps) {
        in[p[0]]++;
        out[p[1]].add(p[0]);
    }

    ArrayDeque<Integer> q = new ArrayDeque<>();
    for(int i = 0; i < n; i++)
        if(in[i] == 0)
            q.offer(i);

    int cnt = 0;
    while(!q.isEmpty()) {
        int i = q.poll();
        System.out.print(i);
        cnt++;
        for(int j : out[i]) {
            in[j]--;
            if(in[j] == 0)
                q.offer(j);
        }
    }
    return cnt == n;
}