您的位置:首页 > 其它

leetcode 210. Course Schedule II

2017-03-10 14:28 531 查看
额今天这道题目。。。实际上是没做出来的

因为超时了

我算了下算法复杂度大概是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];

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