Leetcode 207. Course Schedule

来源:互联网 发布:h5手机游戏源码 编辑:程序博客网 时间:2024/05/29 13:20

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 circlebreak;}    }        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);  //dfsgraph.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 circlebreak;}    }        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);  //dfstmp.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;}}


0 0