第三周:207. Course Schedule(课程计划)
来源:互联网 发布:vb修改word文档的内容 编辑:程序博客网 时间:2024/05/28 05:18
以前做的关于图的题比较少,因此这次做这题感觉到相当的难度。虽然之后是想到了要用DFS或者BFS来解题,但是一直想用堆栈、队列来做,苦于能力不行,最后只能上网查询拓扑算法的DFS、BFS做法,并且不再纠结于一定要使用堆栈或者队列,之后便能顺利解决了。总的来说这道题价值很大,第一次对图算法有了一点理解。
关于这道题,先说说BFS做法,个人觉得更为简单。首先利用vector做出一个二维数组的graph图以供搜索,同时利用一个indegree数组记录所有课程的入度然后将入度为0的课程加入到队列中。循环队列,移除当前入度为0的课程,并根据图把入度为0的课程所对应的后续课程的入度-1,若存在后续课程入度为0,加入队列,不断循环直至队列为空。若移除的课程数等于总课程数,则不存在环,否则存在。
class Solution {public: bool canFinish(int numCourses, vector<pair<int, int>>& prerequisites) { vector<vector<int>> graph(numCourses, vector<int>(0)); vector<int> indegree(numCourses, 0); queue<int> q; for (auto t : prerequisites) { graph[t.second].push_back(t.first); indegree[t.first]++; } int i; for (i = 0; i < indegree.size(); i++) { if (!indegree[i]) q.push(i); } int count = 0; while (!q.empty()) { for (auto t : graph[q.front()]) { indegree[t]--; if (!indegree[t]) q.push(t); } q.pop(); count++; } return count == numCourses; }};
接下来说说DFS的做法。类似的要利用vector做出一个用于搜索的graph图,并且利用一个visit数组记录每一个课程的当前状态,0代表未访问,1代表已访问且正确,-1代表不可访问且错误。对每一个课程都进行一次DFS,同时对于某一个课程的所有后续课程都进行一次DFS,若所有后续课程都均可返回true,证明此课程不存在环,因此visit=1代表此课程已访问且正确,否则此课程就是不可访问且错误。
bool DFS(vector<vector<int>>& graph, vector<int>& visit, int i) {if (visit[i] == -1)return false;if (visit[i] == 1)return true;visit[i] = -1;//等于-1代表不可重复for (auto t : graph[i]) {if (!DFS(graph, visit, t))return false;}visit[i] = 1;//等于1代表已访问return true;}class Solution {public: bool canFinish(int numCourses, vector<pair<int, int>>& prerequisites) { vector<int> visit(numCourses, 0); vector<vector<int>> graph(numCourses, vector<int>(0)); for (auto t : prerequisites) { graph[t.first].push_back(t.second); } for (int i = 0; i < graph.size(); i++) { if (!DFS(graph, visit, i)) return false; } return true; }};
阅读全文
0 0
- 第三周:207. Course Schedule(课程计划)
- LeetCode 207. Course Schedule(课程安排)
- 207 Course Schedule (课程清单)
- leetcode 207. Course Schedule 课程调度 + 拓扑排序
- LeetCode 210. Course Schedule II(课程安排)
- 第十二周 leetcode 207. Course Schedule(Medium)
- LeetCode *** 207. Course Schedule (Topological Sort )
- leetcode 207. Course Schedule(拓扑排序)
- [leetcode] 207.Course Schedule
- 207.Course Schedule
- Leetcode 207. Course Schedule
- 207. Course Schedule
- 207. Course Schedule LeetCode
- 207. Course Schedule
- leetcode 207. Course Schedule
- 207. Course Schedule
- leetcode.207. Course Schedule
- LeetCode 207. Course Schedule
- 根据先序遍历数列和中序遍历数列重建二叉树
- iOS-申请邓白氏编码的超详细流程介绍
- 内容安全策略(CSP) Html5
- TypeScript学习(二)——数据类型一
- 移动端的头部标签和 meta
- 第三周:207. Course Schedule(课程计划)
- python else在for、while、try 语句中使用
- 3 运输层(二)
- CompareValidator控件
- log4j+logstash
- Android 怎么全局替换包名
- Python 读和写
- Win10安装SVN出现2503错误
- swift 画图 Charts的基本使用