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. Spark的优势

    首先了解一下Mapreduce 它最本质的两个过程就是Map和Reduce,Map的应用在于我们需要数据一对一的元素的映射转换,比如说进行截取,进行过滤,或者任何的转换操作,这些一对一的元素转换就称作 ...

  2. Java语言的简介

    Java语言的由来 Java是由Sun Microsystems公司推出的Java面向对象程序设计语言(以下简称Java语言)和Java平台的总称.由James Gosling和同事们共同研发,并在1 ...

  3. JavaSE 常用类与其方法

    1.基本数据类型比较用:== 2.引用数据类型比较用:equals方法 如果引用数据类型使用==比较的话,比较的是地址值 toString类 对象调用toString()需要重写本方法: 在封装类中, ...

  4. 【github&&git】3、git图像化界面GUI的使用

    GIT学习笔记 一.        基础内容 1.git是一个版本控制软件,与svn类似,特点是分布式管理,不需要中间总的服务器,可以增加很多分支. 2.windows下的git叫msysgit,下载 ...

  5. springboot整合freemarker----一点小小的错误

    最近小弟正在学习springboot,没办法,现在微服务太火了.小弟也要顺应时代的潮流啊 :( 好了,废话不多说了!!!! 首先在springboot的pom.xml添加freemarker的依赖 & ...

  6. Python全栈学习_day001知识点

    今日大纲: . 变量. ***** . 常量.** . 注释.*** . 基础数据类型初识(int,str,bool). ***** . 用户输入 input ***** . 流程控制语句if. ** ...

  7. spring配置log4j

    1.引入log4j-xxx.jar包,buildpath. 2.在项目的根目录下新建resources名的文件夹,注意是source folder,并新建log4j.properties文件 3.在l ...

  8. JS--我发现,原来你是这样的JS:面向对象编程OOP[1]--(理解对象和对象属性类型)

    一.介绍 老铁们,这次是JS的面向对象的编程OOP(虽然我没有对象,心累啊,但是可以自己创建啊,哈哈). JS高程里第六章的内容,这章内容在我看来是JS中很难理解的一部分.所以分成三篇博客来逐个理清. ...

  9. htmlElement.style 是只读属性

    document.getElementById('test').style = 'opacity:0'; 在某些机型上,比如苹果 ios 10机型上,会报错.提示 style 属性为只读属性. 建议所 ...

  10. SAP MM PIR里的Lower Limit & Upper Limit

    SAP MM PIR里的Lower Limit & Upper Limit 在PIR的价格的detail数据里,有2个字段:Lower Limit和Upper Limit.在今天之前,笔者从未 ...