Leetcode - Course Schedule II

My code:

import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.Queue;

public class Solution {
    private int V = 0;
    private List<List<Integer>> adj;
    
    public int[] findOrder(int numCourses, int[][] prerequisites) {
        V = numCourses;
        adj = new ArrayList<List<Integer>>();
        for (int i = 0; i < V; i++) {
            adj.add(new ArrayList<Integer>());
        }
        for (int i = 0; i < prerequisites.length; i++) {
            adj.get(prerequisites[i][1]).add(prerequisites[i][0]);
        }
        
        int[] indegree = new int[V];
        for (int i = 0; i < V; i++) {
            for (Integer temp : adj.get(i)) {
                indegree[temp]++;
            }
        }
        
        Queue<Integer> q = new LinkedList<Integer>();
        for (int i = 0; i < V; i++) {
            if (indegree[i] == 0) {
                q.offer(i);
            }
        }
        
        if (q.size() == 0) {
            return new int[0];
        }
        
        int counter = 0;
        int[] ret = new int[V];
        
        while (!q.isEmpty()) {
            Integer node = q.poll();
            for (Integer temp : adj.get(node)) {
                indegree[temp]--;
                if (indegree[temp] == 0) {
                    q.offer(temp);
                }
            }
            ret[counter++] = node;
        }
        if (counter != V) {
            return new int[0];
        }
        return ret;
    }
    
    public static void main(String[] args) {
        Solution test = new Solution();
        int[][] nums = new int[][]{{1,0}};
        int[] ret = test.findOrder(2, nums);
        System.out.println(ret);
    }
}

其实就是 topological sort 实现一下。这是BFS版本

下面是DFS版本:

import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.Queue;

public class Solution {
    private int V = 0;
    private List<List<Integer>> adj;
    
    public int[] findOrder(int numCourses, int[][] prerequisites) {
        V = numCourses;
        adj = new ArrayList<List<Integer>>();
        for (int i = 0; i < V; i++) {
            adj.add(new ArrayList<Integer>());
        }
        for (int i = 0; i < prerequisites.length; i++) {
            adj.get(prerequisites[i][1]).add(prerequisites[i][0]);
        }
        
        boolean[] isVisited = new boolean[V];
        HashSet<Integer> set = new HashSet<Integer>();
        Stack<Integer> st = new Stack<Integer>();
        for (int i = 0; i < V; i++) {
            if (!isVisited[i]) {
                boolean flag = visit(i, isVisited, set, st);
                if (!flag) {
                    return new int[0];
                }
            }
        }
        
        int[] ret = new int[V];
        for (int i = 0; i < V; i++) {
            ret[i] = st.pop();
        }
        
        return ret;
    }
    
    private boolean visit(int node, boolean[] isVisited, HashSet<Integer> set, Stack<Integer> st) {
        if (set.contains(node)) {
            return false;
        }
        set.add(node);
        
        for (Integer temp : adj.get(node)) {
            boolean flag = visit(temp, isVisited, set, st);
            if (!flag) {
                return false;
            }
        }
        set.remove(node);
        if (!isVisited[node]) {
            st.push(node);
        }
        isVisited[node] = true;
        return true;
    }
    
    public static void main(String[] args) {
        Solution test = new Solution();
        int[][] nums = new int[][]{{1,0}};
        int[] ret = test.findOrder(2, nums);
        System.out.println(ret);
    }
}

差不多的思路。就是 isVisited[] 需要在最后设置成 true
在设true之前,还需要先判断下其是否为false,如果是,再把这个结点插入到栈中,防止重复插入元素。

当然,不应该在 visit的地方,加入 if (!isVisited[i]) 的条件,
因为, 1 – 2互联,那么2也需要访问1时发现已经被访问过了
这个访问过了,
可能是 在这次dfs过程中访问过的,
也可能是之前访问过的,
无法区别,导致无法判断是否存在 circle
记住了,topological sort 只是针对于 有向, 无环图,有用

今天做题注意力不集中,不知道怎么了,心不在焉。
哎,不多说了,埋在心里吧。

Anyway, Good luck, Richardo! — 09/09/2016

    原文作者:Richardo92
    原文地址: https://www.jianshu.com/p/4a10343cb546#comments
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞