Java for LeetCode 207 Course Schedule【Medium】
2015-06-07 20:27
465 查看
There are a total of n courses you have to take, labeled from
Some courses may have prerequisites, for example to take course 0 you have to first take course 1, which is expressed as a pair:
Given the total number of courses and a list of prerequisite pairs, is it possible for you to finish all courses?
For example:
There are a total of 2 courses to take. To take course 1 you should have finished course 0. So it is possible.
There are a total of 2 courses to take. To take course 1 you should have finished course 0, and to take course 0 you should also have finished course 1. So it is impossible.
解题思路一:
把每个节点放到图里,然后对每个节点进行BFS,如果出现自环,则为false,否则返回true,JAVA实现如下:
结果TLE,问题在于判断有向图是否有环的时候,对每一个节点判断其实浪费了很多时间%>_<%
解题思路二:
实际上,本题应该用拓扑排序判断图中是否有环,在储存边的时候,应该用set进行储存,具体内存请看考这篇博客:【LeetCode】Course Schedule 解题报告
JAVA传送门如下:
0to
n - 1.
Some courses may have prerequisites, for example to take course 0 you have to first take course 1, which is expressed as a pair:
[0,1]
Given the total number of courses and a list of prerequisite pairs, is it possible for you to finish all courses?
For example:
2, [[1,0]]
There are a total of 2 courses to take. To take course 1 you should have finished course 0. So it is possible.
2, [[1,0],[0,1]]
There are a total of 2 courses to take. To take course 1 you should have finished course 0, and to take course 0 you should also have finished course 1. So it is impossible.
解题思路一:
把每个节点放到图里,然后对每个节点进行BFS,如果出现自环,则为false,否则返回true,JAVA实现如下:
static public boolean canFinish(int numCourses, int[][] prerequisites) { if (prerequisites.length == 0 || prerequisites[0].length == 0) return true; HashMap<Integer, UndirectedGraphNode> hm = new HashMap<Integer, UndirectedGraphNode>(); for (int[] nums : prerequisites) for (int i = 0; i < nums.length - 1; i++) { if (!hm.containsKey(nums[i])) hm.put(nums[i], new UndirectedGraphNode(nums[i])); if (!hm.containsKey(nums[i + 1])) hm.put(nums[i + 1], new UndirectedGraphNode(nums[i + 1])); hm.get(nums[i]).neighbors.add(hm.get(nums[i + 1])); } Iterator<Integer> iterator = hm.keySet().iterator(); while (iterator.hasNext()) if (haveLoop(hm.get(iterator.next()))) return false; return true; } static boolean haveLoop(UndirectedGraphNode root) { HashMap<UndirectedGraphNode, Boolean> hm = new HashMap<UndirectedGraphNode, Boolean>(); Queue<UndirectedGraphNode> queue = new LinkedList<UndirectedGraphNode>(); hm.put(root, true); queue.add(root); while (!queue.isEmpty()) { UndirectedGraphNode temp = queue.poll(); for (UndirectedGraphNode temp2 : temp.neighbors) { if (temp2 == root) return true; if (!hm.containsKey(temp2)) { hm.put(temp2, true); queue.add(temp2); } } } return false; }
结果TLE,问题在于判断有向图是否有环的时候,对每一个节点判断其实浪费了很多时间%>_<%
解题思路二:
实际上,本题应该用拓扑排序判断图中是否有环,在储存边的时候,应该用set进行储存,具体内存请看考这篇博客:【LeetCode】Course Schedule 解题报告
JAVA传送门如下:
public boolean canFinish(int numCourses, int[][] prerequisites) { List<Set> posts = new ArrayList<Set>(); for (int i = 0; i < numCourses; i++) posts.add(new HashSet<Integer>()); for (int i = 0; i < prerequisites.length; i++) posts.get(prerequisites[i][1]).add(prerequisites[i][0]); // count the pre-courses int[] preNums = new int[numCourses]; for (int i = 0; i < numCourses; i++) { Set set = posts.get(i); Iterator<Integer> it = set.iterator(); while (it.hasNext()) { preNums[it.next()]++; } } // remove a non-pre course each time for (int i = 0; i < numCourses; i++) { // find a non-pre course int j = 0; for ( ; j < numCourses; j++) { if (preNums[j] == 0) break; } // if not find a non-pre course if (j == numCourses) return false; preNums[j] = -1; // decrease courses that post the course Set set = posts.get(j); Iterator<Integer> it = set.iterator(); while (it.hasNext()) { preNums[it.next()]--; } } return true; }
相关文章推荐
- javaSWing程序命令行和IDE运行没有问题,打包成jar后直接双击运行部分功能不行
- 《Java从入门到精通》第五章学习笔记
- 226_尚学堂_高淇_java300集最全视频教程_【GOF23设计模式】_单例模式_应用场景_饿汉式_懒汉式
- wait()+notify实现java生产者-消费者
- zookeeper - java操作
- 在集群中Java 通过调用API操作HBase 0.98
- 用Java写的一个类似QQ登陆界面的程序 Java QQ登陆界面
- java语言的跨平台原理以及环境的搭建
- java中Hashtable浅析
- SSH之Struts2篇
- java动态代理
- [推荐视频教程]-[Java][传智播客 俄罗斯方法游戏开发 视频教程][avi]
- Java小日历
- Java for LeetCode 206 Reverse Linked List
- java 之 类和对象 笔记
- java基础—IO流概述
- Java for LeetCode 205 Isomorphic Strings
- java 常用日期处理
- java中对集合List的操作
- Java线程(篇外篇):线程本地变量ThreadLocal