Leetcode 207. Course Schedule
2017-02-19 15:22
393 查看
Leetcode 207. Course Schedule
TLE 以下代码,采用dfs来判断是否会出现循环
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
public class Solution {
public boolean canFinish(int numCourses, int[][] prerequisites) {
//fast and slow point.
//dfs.
if(numCourses<=1) return true;
List<Set<Integer>> graph = new ArrayList<Set<Integer>>();
for(int i=0;i<numCourses;i++) graph.add(new HashSet<Integer>());
for(int[] edge:prerequisites){
graph.get(edge[1]).add(edge[0]);
}
List<Integer> early = new ArrayList<Integer>();
for(int i=0;i<numCourses;i++){
if(graph.get(i).size()>0) early.add(i);
}
boolean res = true; // no circle
for(int i:early){
List<Integer> tmp = new ArrayList<Integer>();
res = iscircle(i,graph,tmp);
if(!res){ // exists circle
break;
}
}
return res;
}
private boolean iscircle(int i, List<Set<Integer>> graph, List<Integer> tmp) {
// TODO Auto-generated method stub
//tmp.add(i);
if(tmp.contains(i)) return false;
// two point: k,h
// int k=i, h=i;
boolean res = true;
Set<Integer> nexti = new HashSet<Integer>(graph.get(i));
for(int j: nexti){
graph.get(i).remove(j);
tmp.add(i);
res = iscircle(j,graph,tmp); //dfs
graph.get(i).add(j);
tmp.remove(tmp.size()-1);
if(!res){
break;
}
}
return res;
}
}
easy bfs java solution
TLE 以下代码,采用dfs来判断是否会出现循环
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
public class Solution {
public boolean canFinish(int numCourses, int[][] prerequisites) {
//fast and slow point.
//dfs.
if(numCourses<=1) return true;
List<Set<Integer>> graph = new ArrayList<Set<Integer>>();
for(int i=0;i<numCourses;i++) graph.add(new HashSet<Integer>());
for(int[] edge:prerequisites){
graph.get(edge[1]).add(edge[0]);
}
List<Integer> early = new ArrayList<Integer>();
for(int i=0;i<numCourses;i++){
if(graph.get(i).size()>0) early.add(i);
}
boolean res = true; // no circle
for(int i:early){
List<Integer> tmp = new ArrayList<Integer>();
res = iscircle(i,graph,tmp);
if(!res){ // exists circle
break;
}
}
return res;
}
private boolean iscircle(int i, List<Set<Integer>> graph, List<Integer> tmp) {
// TODO Auto-generated method stub
//tmp.add(i);
if(tmp.contains(i)) return false;
// two point: k,h
// int k=i, h=i;
boolean res = true;
Set<Integer> nexti = new HashSet<Integer>(graph.get(i));
for(int j: nexti){
graph.get(i).remove(j);
tmp.add(i);
res = iscircle(j,graph,tmp); //dfs
graph.get(i).add(j);
tmp.remove(tmp.size()-1);
if(!res){
break;
}
}
return res;
}
}
import java.util.ArrayList; import java.util.HashSet; import java.util.List; import java.util.Set; public class Solution { public boolean canFinish(int numCourses, int[][] prerequisites) { //fast and slow point. //dfs. if(numCourses<=1) return true; List<Set<Integer>> graph = new ArrayList<Set<Integer>>(); for(int i=0;i<numCourses;i++) graph.add(new HashSet<Integer>()); for(int[] edge:prerequisites){ graph.get(edge[1]).add(edge[0]); } List<Integer> early = new ArrayList<Integer>(); for(int i=0;i<numCourses;i++){ if(graph.get(i).size()>0) early.add(i); } boolean res = true; // no circle for(int i:early){ List<Integer> tmp = new ArrayList<Integer>(); res = iscircle(i,graph,tmp); if(!res){ // exists circle break; } } return res; } private boolean iscircle(int i, List<Set<Integer>> graph, List<Integer> tmp) { // TODO Auto-generated method stub //tmp.add(i); if(tmp.contains(i)) return false; // two point: k,h // int k=i, h=i; boolean res = true; for(int j: graph.get(i)){ //graph.get(i).remove(j); tmp.add(i); res = iscircle(j,graph,tmp); //dfs tmp.remove(tmp.size()-1); if(!res){ break; } } return res; } }
easy bfs java solution
import java.util.ArrayList; import java.util.HashSet; import java.util.LinkedList; import java.util.List; import java.util.Queue; import java.util.Set; public class Solution { public boolean canFinish(int numCourses, int[][] prerequisites) { int[][] matrix = new int[numCourses][numCourses]; // i -> j int[] indegree = new int[numCourses]; for (int i=0; i<prerequisites.length; i++) { int ready = prerequisites[i][0]; int pre = prerequisites[i][1]; if (matrix[pre][ready] == 0) indegree[ready]++; //duplicate case matrix[pre][ready] = 1; } int count = 0; Queue<Integer> queue = new LinkedList(); for (int i=0; i<indegree.length; i++) { if (indegree[i] == 0) queue.offer(i); } while(!queue.isEmpty()) { int course = queue.poll(); count++; for (int i=0; i<numCourses; i++) { if (matrix[course][i] != 0) { if (--indegree[i] == 0) queue.offer(i); } } } return count == numCourses; } }
相关文章推荐
- Leetcode 207. Course Schedule & 210. Course Schedule II
- LeetCode 207. Course Schedule
- LeetCode 207. Course Schedule(拓扑排序)
- LeetCode207. Course Schedule
- leetcode 207. Course Schedule 课程调度 + 拓扑排序
- leetcode 207. Course Schedule
- [leetcode] 207. Course Schedule
- 第十二周 leetcode 207. Course Schedule(Medium)
- Leetcode 207. Course Schedule
- 【LeetCode】207. Course Schedule (2 solutions)
- LeetCode 207. Course Schedule
- leetcode 207. Course Schedule
- [leetcode] 207. Course Schedule 解题报告
- [LeetCode] 207. Course Schedule
- leetcode-207. Course Schedule
- [LeetCode]207. Course Schedule 课程表
- [leetcode]207. Course Schedule
- [LeetCode] 207. Course Schedule 课程安排
- [Leetcode] 207. Course Schedule 解题报告
- 【Leetcode】207. Course Schedule