207. Course Schedule

https://blog.csdn.net/wongleetion/article/details/79433101

问题的实质就是判断一个有向图是否有环,利用入度去解决这个问题

使用bfs解决问题。

初始化时,利用二维vector存储节点间的关系,并存储每个节点的入度,同时将入度为0的节点放入队列,这是图的起始点。

每次将队列中的节点弹出后,然后将对应的课程的入度减少,如果有此时产生入度为0的节点,再加入队列中,直到队列为空。

最终判断整个入度的存储是否还有节点入度不为0。

class Solution {
public:
bool canFinish(int numCourses, vector<pair<int, int>>& prerequisites) {
vector<vector<int>> graph(numCourses,vector<int>());
vector<int> inDegree(numCourses,);
for(auto i : prerequisites){
graph[i.second].push_back(i.first);
inDegree[i.first]++;
} queue<int> q;
for(int i = ;i < numCourses;i++){
if(inDegree[i] == )
q.push(i);
} while(!q.empty()){
int num = q.front();
q.pop();
for(auto i : graph[num]){
inDegree[i]--;
if(inDegree[i] == )
q.push(i);
}
} for(int i = ;i < numCourses;i++){
if(inDegree[i] != )
return false;
}
return true;
}
};

210. Course Schedule II

这个题是要你把学习课程的路径求出来,如果有环,就返回空数组。

这个题基本上与Course Schedule代码差不多,只需要每次在queue弹出的时候存入结果就好,还需要判断是否有环。

class Solution {
public:
vector<int> findOrder(int numCourses, vector<vector<int>>& prerequisites) {
vector<vector<int>> graph(numCourses);
vector<int> indegree(numCourses);
vector<int> result;
for(int i = ;i < prerequisites.size();i++){
graph[prerequisites[i][]].push_back(prerequisites[i][]);
indegree[prerequisites[i][]]++;
}
queue<int> q;
for(int i = ;i < numCourses;i++){
if(indegree[i] == )
q.push(i);
}
while(!q.empty()){
int course = q.front();
q.pop();
result.push_back(course);
for(int i = ;i < graph[course].size();i++){
indegree[graph[course][i]]--;
if(indegree[graph[course][i]] == )
q.push(graph[course][i]);
}
}
vector<int> res;
for(int i = ;i < numCourses;i++){
if(indegree[i] != )
return res;
}
return result;
}
};

310. Minimum Height Trees

https://www.cnblogs.com/grandyang/p/5000291.html

给定一个拥有树性质的无向图,图的每一个节点都可以视为一棵树的根节点。在所有可能的树中,找出高度最小的树,并返回他们的树根。

如果剩余的节点数超过两个,就可以继续去除叶节点,比如剩余了3个节点,那么其实可以把外面的两个节点去掉,就只剩一个节点了,而且以这个节点做根,得到的树的高度最小;而如果剩余了2个节点,那么不论让谁当根,得到的高度都是一样的;如果剩余一个,自然不必多说就是根节点了。

我们开始将所有只有一个连接边的节点(叶节点)都存入到一个队列queue中,然后我们遍历每一个叶节点,通过图来找到和其相连的节点,并且在其相连节点的集合中将该叶节点删去,如果删完后此节点也也变成一个叶节点了,加入队列中,再下一轮删除。那么我们删到什么时候呢,当节点数小于等于2时候停止,此时剩下的一个或两个节点就是我们要求的最小高度树的根节点

class Solution {
public:
vector<int> findMinHeightTrees(int n, vector<vector<int>>& edges) {
if(n == )
return {};
vector<int> res;
vector<unordered_set<int>> adj(n);
queue<int> q;
for(int i = ;i < edges.size();i++){
adj[edges[i][]].insert(edges[i][]);
adj[edges[i][]].insert(edges[i][]);
}
for(int i = ;i < n;i++){
if(adj[i].size() == )
q.push(i);
}
while(n > ){
int size = q.size();
n -= size;
for(int i = ;i < size;i++){
int tmp = q.front();
q.pop();
for(auto j : adj[tmp]){
adj[j].erase(tmp);
if(adj[j].size() == )
q.push(j);
}
}
}
while(!q.empty()){
int tmp = q.front();
q.pop();
res.push_back(tmp);
}
return res;
}
};

207. Course Schedule的更多相关文章

  1. LeetCode - 207. Course Schedule

    207. Course Schedule Problem's Link ---------------------------------------------------------------- ...

  2. LN : leetcode 207 Course Schedule

    lc 207 Course Schedule 207 Course Schedule There are a total of n courses you have to take, labeled ...

  3. [LeetCode] 207. Course Schedule 课程清单

    There are a total of n courses you have to take, labeled from 0 to n-1. Some courses may have prereq ...

  4. Java for LeetCode 207 Course Schedule【Medium】

    There are a total of n courses you have to take, labeled from 0 to n - 1. Some courses may have prer ...

  5. 【LeetCode】207. Course Schedule (2 solutions)

    Course Schedule There are a total of n courses you have to take, labeled from 0 to n - 1. Some cours ...

  6. [LeetCode] 207. Course Schedule 课程安排

    There are a total of n courses you have to take, labeled from 0 to n - 1. Some courses may have prer ...

  7. 【刷题-LeetCode】207. Course Schedule

    Course Schedule There are a total of numCourses courses you have to take, labeled from 0 to numCours ...

  8. (medium)LeetCode 207.Course Schedule

    There are a total of n courses you have to take, labeled from 0 to n - 1. Some courses may have prer ...

  9. LeetCode 207. Course Schedule(拓扑排序)

    题目 There are a total of n courses you have to take, labeled from 0 to n - 1. Some courses may have p ...

随机推荐

  1. AngularJS+Ionic开发-1.搭建开发环境

    临时项目需要使用AngularJS+Ionic+Cordova技术,半年前跟别人用过一段时间做过几个页面,目前别人已经无法联系了,只能我自己上了. 上次做完项目后,想抽时间好好巩固一下这方面的知识面来 ...

  2. 如何把string转换char*类型

    需要调用string头文件  ( #include<string> ) 用string里的函数c_str()可以把string转换为char* 例如 char * c_str2=str1. ...

  3. 本地navicate for mysql怎么修改密码?

    1.以前在本地设置sql库密码,就是在本地新建数据库的时候就输入,怎么也链接不上,原来是新建数据库的时候不能输入密码,需要在内部修改. 2. 打开mysql user表 3. 打开mysql user ...

  4. 获取子元素节点(children,childNodes)

    在js中获取元素节点有DOM对应的方法如getElementsByTagName()等等..对于获取子元素还有另外一种获取方法ChildNodes 不过ChidNodes在高级浏览器除(IE6-8)里 ...

  5. 喜闻乐见-Activity生命周期

    Activity的生命周期,对于Android开发者来说,再熟悉不过了.但是我们接触到的资料,绝大部分都只是谈了一些表面上的东西,例如各个回调的顺序等等.本文试图换个角度来讲解,也希望对各位读者有所帮 ...

  6. Video.js web视频播放器

    免费视频播放器videojs中文教程 Video.js是一款web视频播放器,支持html5和flash两种播放方式.更多关于video.js的介绍,可以访问官方网站介绍,我之前也写过一篇关于vide ...

  7. centos6分辨率设置

    问题描述 centos 6.9最小化安装后, 分辨率会很大, 当然也可以最小化VM虚拟机, 但是有强迫症的朋友可以设置一下. 解决方法 打开/etc/grub.conf配置文件, 在kernel 的最 ...

  8. Django日志信息路径的设置

    django日志信息路径的设置, 因为我们经常在代码业务上线时候 需要进行调试,查看代码的后台运行情况,就需要设置django项目的具体的日志信息运维的路径了 LOGGING = { 'version ...

  9. 用Python实现数据结构之二叉搜索树

    二叉搜索树 二叉搜索树是一种特殊的二叉树,它的特点是: 对于任意一个节点p,存储在p的左子树的中的所有节点中的值都小于p中的值 对于任意一个节点p,存储在p的右子树的中的所有节点中的值都大于p中的值 ...

  10. 第七章 鼠标(CHECKER1)

    CHECKER1程序将客户区划分成25个矩形,构成一个5*5的数组.如果在其中一个矩形内单击鼠标,就用X形填充该矩形.再次单击,则X形消失. /*--------------------------- ...