您的位置:首页 > 其它

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;
}
}

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;
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: