leetcode 210. Course Schedule II

来源:互联网 发布:淘宝直通车添加关键词 编辑:程序博客网 时间:2024/06/07 01:53

额今天这道题目。。。实际上是没做出来的

因为超时了

我算了下算法复杂度大概是O(n^2)

但是花了一个小时搞出来的。。实在是。。不舍得删了。。。留着自己看吧。。。

public class Solution {    public int[] findOrder(int numCourses, int[][] prerequisites) {            HashMap<Integer,LinkedList<Integer>> map=new HashMap<>();            for(int i=0;i<prerequisites.length;i++){                if(map.containsKey(prerequisites[i][0])){                    LinkedList<Integer> list=map.get(prerequisites[i][0]);                    list.add(prerequisites[i][1]);                    map.put(prerequisites[i][0],list);                }else{                    LinkedList<Integer> list=new LinkedList<>();                    list.add(prerequisites[i][1]);                    map.put(prerequisites[i][0],list);                }            }            Set<Integer> set=new HashSet<>();            LinkedList<Integer> answear=new LinkedList<>();            LinkedList<Integer> table=new LinkedList<>();            for(int i=0;i<numCourses;i++){                if(!map.containsKey(i)){                    answear.add(i);                    set.add(i);                }else{                    table.add(i);                }            }            boolean mark2=false;            int len=table.size();            while(table.size()!=0){                for(int i=0;i<table.size();i++){                    LinkedList<Integer> temp=map.get(table.get(i));                    boolean mark=true;                    for(int j=0;j<temp.size();j++){                        if(!set.contains(temp.get(j))){                            mark=false;                            break;                        }                    }                    if(mark){                        answear.add(table.get(i));                        set.add(table.get(i));                        table.remove(i);                        i--;                    }                }                if(len>table.size()){                    len=table.size();                }else{                    mark2=true;                    break;                }            }            if(mark2){                int[] nums2=new int[0];                return nums2;            }            int[] nums=new int[answear.size()];            for(int i=0;i<answear.size();i++){                nums[i]=answear.get(i);            }            return nums;    }}
额下面是标准答案之一,供学习
public class Solution {    public int[] findOrder(int numCourses, int[][] prerequisites) {        List<List<Integer>> adj = new ArrayList<>(numCourses);        for (int i = 0; i < numCourses; i++) adj.add(i, new ArrayList<>());        for (int i = 0; i < prerequisites.length; i++) adj.get(prerequisites[i][1]).add(prerequisites[i][0]);        boolean[] visited = new boolean[numCourses];        Stack<Integer> stack = new Stack<>();        for (int i = 0; i < numCourses; i++) {            if (!topologicalSort(adj, i, stack, visited, new boolean[numCourses])) return new int[0];        }        int i = 0;        int[] result = new int[numCourses];        while (!stack.isEmpty()) {            result[i++] = stack.pop();        }        return result;    }        private boolean topologicalSort(List<List<Integer>> adj, int v, Stack<Integer> stack, boolean[] visited, boolean[] isLoop) {        if (visited[v]) return true;        if (isLoop[v]) return false;        isLoop[v] = true;        for (Integer u : adj.get(v)) {            if (!topologicalSort(adj, u, stack, visited, isLoop)) return false;        }        visited[v] = true;        stack.push(v);        return true;    }}

0 0