207. Course Schedule

Based on BFS.

import java.lang.reflect.Array;

public class Solution {
    public boolean canFinish(int numCourses, int[][] prerequisites) {
        if(numCourses<=1)
            return true;
            
        ArrayList<Integer>[] adjacencyList = (ArrayList<Integer>[])Array.newInstance(ArrayList.class, numCourses);
        for(int i = 0; i<numCourses; ++i)
        {
            adjacencyList[i] = new ArrayList<Integer>();
        }
        int[] indegree = new int[numCourses];
        for(int[] prerequesite: prerequisites)
        {
            adjacencyList[prerequesite[1]].add(prerequesite[0]);
            ++indegree[prerequesite[0]];
        }
        ArrayList<Integer> outmostLayer = new ArrayList<Integer>();
        for(int i = 0; i<numCourses; ++i)
        {
            if(indegree[i]==0)
                outmostLayer.add(i);
        }
        
        while(outmostLayer.size()>0)
        {
            ArrayList<Integer> nextLayer = new ArrayList<Integer>();
            for(int node: outmostLayer)
            {
                for(int next: adjacencyList[node])
                {
                    --indegree[next];
                    if(indegree[next]==0)
                        nextLayer.add(next);
                }
            }
            outmostLayer = nextLayer;
        }
        
        for(int i = 0; i<numCourses; ++i)
        {
            if(indegree[i]!=0)
                return false;
        }
        return true;
    }
    
}

 

DFS. But having Stack overflow issue.

import java.lang.reflect.Array;

public class Solution {
    public boolean canFinish(int numCourses, int[][] prerequisites) {
        if(numCourses<=1)
            return true;
            
        ArrayList<Integer>[] adjacencyList = (ArrayList<Integer>[])Array.newInstance(ArrayList.class, numCourses);
        for(int i = 0; i<numCourses; ++i)
        {
            adjacencyList[i] = new ArrayList<Integer>();
        }
        boolean[] startingCourses = new boolean[numCourses];
        Arrays.fill(startingCourses, true);
        for(int[] prerequesite: prerequisites)
        {
            adjacencyList[prerequesite[1]].add(prerequesite[0]);
            startingCourses[prerequesite[0]] = false;
        }
        
        //boolean[] startingCourses = new boolean[numCourses];
        for(int i = 0; i<numCourses; ++i)
        {
            if(startingCourses[i])
            {
                boolean[] visit = new boolean[numCourses];
                if(DFS(adjacencyList, i, visit));
                    return false;
            }
        }
        return true;
    }
    
    //return true=>have cycle.
    private boolean DFS(ArrayList<Integer>[] adjacencyList, int node, boolean[] visit)
    {
        if(visit[node] == true)
            return true; //have cycle!
        
        visit[node] = true;
        for(int out: adjacencyList[node])
        {
            DFS(adjacencyList, out, visit);
            visit[out] = false;
        }
        return false;
    }
}

 

你可能感兴趣的:(207. Course Schedule)