LeetCode 207 Course Schedule

来源:互联网 发布:手机上怎么修改mac地址 编辑:程序博客网 时间:2024/05/29 18:02
class Solution {    public boolean canFinish(int numCourses, int[][] prerequisites) {        ArrayList[] graph = new ArrayList[numCourses];        int[] degree = new int[numCourses];        Queue queue = new LinkedList();        int count = 0;                for(int i = 0;i<numCourses;i++){            graph[i] = new ArrayList();//针对每一个顶点创建ArrayList        }                for(int i = 0;i<prerequisites.length;i++){            int k = prerequisites[i][1];//图中顶点序号为i的课程的先修课程序号为prerequisites[i][1]即k            degree[k]++;//先修课程顶点出度加1            graph[prerequisites[i][0]].add(k);//在顶点i课程的arraylist中加入先修课程的顶点序号k        }        for(int i = 0;i<degree.length;i++){            if(degree[i] == 0){//如果该课程不是其他任何课程的先修,加入队列,计数加一                queue.add(i);                count++;            }        }                while(queue.size() != 0){            int course = (int) queue.poll();            for(int i = 0;i<graph[course].size();i++){                int pointer = (int) graph[course].get(i);                degree[pointer]--;                if(degree[pointer] == 0){                    queue.add(pointer);                    count++;                }            }        }        if(count == numCourses)            return true;        else            return false;    }}


以上是第一种办法,广度优先搜索(BFS)




class Solution {    public boolean canFinish(int numCourses, int[][] prerequisites) {        ArrayList[] graph = new ArrayList[numCourses];        for(int i = 0;i<numCourses;i++){            graph[i] = new ArrayList();        }        boolean[] visited = new boolean[numCourses];        for(int i = 0;i<prerequisites.length;i++){            graph[prerequisites[i][1]].add(prerequisites[i][0]);        }//其实就相当于给每个顶点创建了链表,总的就是一个邻接表。每个链表里都是其先修课程序号。                for(int i = 0;i<numCourses;i++){            if(!dfs(graph,visited,i)){//dfs的结果如果是false,则表示有环。                return false;            }        }        return true;    }        private boolean dfs(ArrayList[] graph,boolean[] visited,int course){        if(visited[course])            return false;        else            visited[course] = true;        for(int i = 0;i<graph[course].size();i++){            if(!dfs(graph,visited,(int)graph[course].get(i))){                return false;            }        }        visited[course] = false;//如果只是某个无关联的序号被访问过,作为其他序号的先修课程进行dfs的时候,就需要在dfs前恢复false状态        return true;    }}
这是深度优先搜索方法(DFS)。

原创粉丝点击