中级农民
- 积分
- 100
- 大米
- 颗
- 鳄梨
- 个
- 水井
- 尺
- 蓝莓
- 颗
- 萝卜
- 根
- 小米
- 粒
- 学分
- 个
- 注册时间
- 2016-1-20
- 最后登录
- 1970-1-1
|
leetcode 207
https://leetcode.com/problems/course-schedule/
初看此题,很自然联想到拓扑排序,我使用dfs解此题
代码如下
class Solution {
public boolean canFinish(int numCourses, int[][] prerequisites) {
if(numCourses == 0){
return true;
}
//make a graph based on prerequisites using hashMap
//for each course from 0 to n-1, should have a key
//because not all course will be expressed in prerequisites list,
//there may be some course does not have any prerequisites)
HashMap<Integer, List<Integer>> courseGraph = new HashMap<Integer, List<Integer>>();
for(int i = 0; i < numCourses; i++){
courseGraph.put(i, new ArrayList<Integer>());
}
for(int[] courseEdge: prerequisites){
courseGraph.get(courseEdge[0]).add(courseEdge[1]);
}
//hold states for all course, there are three states for each course
//0 --> not visited
//1 --> visited, but not in active path
//2 --> visited, and in active path
int[] visitedCourse = new int[numCourses];
for(int i = 0; i < numCourses; i++ ){
boolean result = dfsHelper(i, courseGraph, visitedCourse);
if(result == false){
return false;
}
}
return true;
}
private boolean dfsHelper(
int course,
HashMap<Integer, List<Integer>> courseGraph,
int[]visitedCourse
){
//course has been visited and in active path
if(visitedCourse[course] == 2){
return false;
}
//course has been visited but not in active path
else if(visitedCourse[course] == 1){
return true;
}
//path has not been visited, add to active path
else{
visitedCourse[course] = 2;
}
List<Integer> courseList = courseGraph.get(course);
for(int i = 0; i < courseList.size(); i++){
if( !dfsHelper(courseList.get(i), courseGraph, visitedCourse)){
return false;
}
}
//remove from active path
visitedCourse[course] = 1;
return true;
}
} |
|