leetcode [207]Course Schedule
Posted xiaobaituyun
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了leetcode [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.
Note:
- The input prerequisites is a graph represented by a list of edges, not adjacency matrices. Read more about how a graph is represented.
- You may assume that there are no duplicate edges in the input prerequisites.
题目大意:
其实就是判断一个有向图中是否存在环,可以使用BFS和DFS做,BFS的效率比DFS要高一些
解法:
java:
BFS解法:
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(); for (int i=0;i<prerequisites.length;i++){ degree[prerequisites[i][1]]++; graph[prerequisites[i][0]].add(prerequisites[i][1]); } for (int i=0;i<numCourses;i++){ if(degree[i]==0){ ((LinkedList) queue).add(i); count++; } } while (!queue.isEmpty()){ int course=(int)((LinkedList) queue).pollFirst(); for (int i=0;i<graph[course].size();i++){ int index=(int)graph[course].get(i); degree[index]--; if (degree[index]==0){ ((LinkedList) queue).add(index); count++; } } } if(count==numCourses) return true; else return false; } }
DFS解法;
class Solution { public boolean canFinish(int numCourses, int[][] prerequisites) { //记录有向图图节点之间的关系 ArrayList[] graph=new ArrayList[numCourses]; //记录每个节点是否被访问过 boolean[] visited=new boolean[numCourses]; for (int i=0;i<numCourses;i++) graph[i]=new ArrayList(); for (int i=0;i<prerequisites.length;i++){ graph[prerequisites[i][0]].add(prerequisites[i][1]); } for (int i=0;i<numCourses;i++){ if (!dfs(graph,visited,i)) 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; return true; } }
以上是关于leetcode [207]Course Schedule的主要内容,如果未能解决你的问题,请参考以下文章
LeetCode 207. Course Schedule(拓扑排序)