Problem

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
Given n = 2, prerequisites = [[1,0]]
Return true

Given n = 2, prerequisites = [[1,0],[0,1]]
Return false

思路

  • get indegrees.

  • because courses are labeled from 0 to n-1, use array

  • put all zero-degree courses to queue

  • while queue is not empty,

    • poll the front element from it,
    • count ++
    • loop through all its adjacent element
      • degree decrement
      • enqueue those zero-degree adjs
  • if count == num of courses return true
  • notice
    • you can build a graph, like List[]
    • or not, because we already have all edges
    public boolean canFinish(int numCourses, int[][] prerequisites) {
        int[] indegrees = new int[numCourses];
        for (int[] edge: prerequisites) {
            indegrees[edge[0]] += 1;
        }

        Queue<Integer> queue = new LinkedList<>();
        for (int i = 0; i < indegrees.length; i++) {
            if (indegrees[i] == 0) {
                queue.offer(i);
            }
        }

        int count = 0;
        while (!queue.isEmpty()) {
            int curt = queue.poll();
            count++;
            for (int[] edge: prerequisites) {
                if (edge[1] != curt) continue;
                int adj = edge[0];
                indegrees[adj]--;
                if (indegrees[adj] == 0) {
                    queue.offer(adj);
                }
            }
        }
        return numCourses == count;
    }

build graph

    public boolean canFinish(int numCourses, int[][] prerequisites) {
        int[] indegrees = new int[numCourses];
        List[] graph = new List[numCourses];

        for (int i = 0; i < graph.length; i++) {
            graph[i] = new ArrayList<Integer>();
        }

        for (int[] edge: prerequisites) {
            indegrees[edge[0]] += 1;
            graph[edge[1]].add(edge[0]);

        }

        Queue<Integer> queue = new LinkedList<>();
        for (int i = 0; i < indegrees.length; i++) {
            if (indegrees[i] == 0) {
                queue.offer(i);
            }
        }

        int count = 0;
        while (!queue.isEmpty()) {
            int curt = queue.poll();
            count++;

            for (Object obj: graph[curt]) {
                int adj = (int)obj;
                indegrees[adj]--;
                if (indegrees[adj] == 0) {
                    queue.offer(adj);
                }
            }
        }
        return numCourses == count;
    }

results matching ""

    No results matching ""