207 Course Schedule
2016-02-13 15:57
375 查看
题目链接:https://leetcode.com/problems/course-schedule/
题目:
解题思路:
这题的考点是图的深度遍历。
需要说明的是,课程数为 2,表示课程为 0,1。即,课程数始终从 0 开始编号。
没有心情写思路了,分手的第一天。
参考链接:http://www.programcreek.com/2014/05/leetcode-course-schedule-java/
代码实现:
题目:
There are a total of n courses you have to take, labeled from 0 to 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. Note: The input prerequisites is a graph represented by a list of edges, not adjacency matrices. Read more about how a graph is represented. click to show more hints. Hints: This problem is equivalent to finding if a cycle exists in a directed graph. If a cycle exists, no topological ordering exists and therefore it will be impossible to take all courses. Topological Sort via DFS - A great video tutorial (21 minutes) on Coursera explaining the basic concepts of Topological Sort. Topological sort could also be done via BFS.
解题思路:
这题的考点是图的深度遍历。
需要说明的是,课程数为 2,表示课程为 0,1。即,课程数始终从 0 开始编号。
没有心情写思路了,分手的第一天。
参考链接:http://www.programcreek.com/2014/05/leetcode-course-schedule-java/
代码实现:
public class Solution { public boolean canFinish(int numCourses, int[][] prerequisites) { if(prerequisites == null) return false; int len = prerequisites.length; if(numCourses == 0 || len == 0) return true; int[] visit = new int[numCourses]; // 将一个课程和其前驱放到 map 中 HashMap<Integer, ArrayList<Integer>> map = new HashMap<Integer, ArrayList<Integer>>(); for(int[] a : prerequisites) { if(map.containsKey(a[0])) { map.get(a[0]).add(a[1]); } else { ArrayList<Integer> l = new ArrayList(); l.add(a[1]); map.put(a[0], l); } } for(int i = 0; i < numCourses; i ++) { if(!canFindDFS(visit, map, i)) return false; } return true; } boolean canFindDFS(int[] visit, HashMap<Integer, ArrayList<Integer>> map, int i) { if(visit[i] == -1) // 正在被访问visited return false; if(visit[i] == 1) // 已访问过,且其后继没有环 return true; visit[i] = -1; if(map.containsKey(i)) { for(Integer k : map.get(i)) { if(!canFindDFS(visit, map, k)) return false; } } visit[i] = 1; return true; } }
35 / 35 test cases passed. Status: Accepted Runtime: 11 ms
相关文章推荐
- ACCESS作为网站数据库的弊端
- 格式化数据#7:开放课/公开课
- FFmpeg深入分析之零-基础
- 食物链(poj1182)
- JAVA容器类
- android的五种布局模式
- 阶乘
- LVS NAT 模式
- 避免僵尸进程
- C语言memset详解
- opencv 下载地址
- 日经春秋 20160213
- HDU 2444 The Accomodation of Students(二分图判定+最大匹配)
- android 图片加载工具
- 天声人語 20160213 アインシュタインの宿題
- C#设计模式——建造者模式
- s3c2440时钟+nandflash拷贝至SDRAM+开启mmu
- 联想G50笔记本如何安装系统
- ANDROID_MARS学习笔记_S01原始版_005_RadioGroup\CheckBox\Toast
- JavaScript与正则表达式