提交 cb7085bb 编写于 作者: 每日一练社区's avatar 每日一练社区

add one exercises

上级 17a1a4b4
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": [
"leetcode",
"课程表"
],
"children": [],
"export": [
"solution.json"
],
"title": "课程表"
}
\ No newline at end of file
<p>你这个学期必须选修 <code>numCourses</code> 门课程,记为 <code>0</code> 到 <code>numCourses - 1</code></p>
<p>在选修某些课程之前需要一些先修课程。 先修课程按数组 <code>prerequisites</code> 给出,其中 <code>prerequisites[i] = [a<sub>i</sub>, b<sub>i</sub>]</code> ,表示如果要学习课程 <code>a<sub>i</sub></code><strong>必须</strong> 先学习课程  <code>b<sub>i</sub></code><sub> </sub></p>
<ul>
<li>例如,先修课程对 <code>[0, 1]</code> 表示:想要学习课程 <code>0</code> ,你需要先完成课程 <code>1</code></li>
</ul>
<p>请你判断是否可能完成所有课程的学习?如果可以,返回 <code>true</code> ;否则,返回 <code>false</code></p>
<p> </p>
<p><strong>示例 1:</strong></p>
<pre>
<strong>输入:</strong>numCourses = 2, prerequisites = [[1,0]]
<strong>输出:</strong>true
<strong>解释:</strong>总共有 2 门课程。学习课程 1 之前,你需要完成课程 0 。这是可能的。</pre>
<p><strong>示例 2:</strong></p>
<pre>
<strong>输入:</strong>numCourses = 2, prerequisites = [[1,0],[0,1]]
<strong>输出:</strong>false
<strong>解释:</strong>总共有 2 门课程。学习课程 1 之前,你需要先完成​课程 0 ;并且学习课程 0 之前,你还应先完成课程 1 。这是不可能的。</pre>
<p> </p>
<p><strong>提示:</strong></p>
<ul>
<li><code>1 <= numCourses <= 10<sup>5</sup></code></li>
<li><code>0 <= prerequisites.length <= 5000</code></li>
<li><code>prerequisites[i].length == 2</code></li>
<li><code>0 <= a<sub>i</sub>, b<sub>i</sub> < numCourses</code></li>
<li><code>prerequisites[i]</code> 中的所有课程对 <strong>互不相同</strong></li>
</ul>
#include <bits/stdc++.h>
using namespace std;
class Solution
{
public:
bool canFinish(int numCourses, vector<vector<int>> &prerequisites)
{
vector<vector<int>> graph(numCourses, vector<int>());
for (auto num : prerequisites)
{
graph[num[1]].push_back(num[0]);
}
vector<int> visit(numCourses);
for (int i = 0; i < numCourses; i++)
{
if (!dfs(graph, visit, i))
return false;
}
return true;
}
bool dfs(vector<vector<int>> &g, vector<int> &visit, int i)
{
if (visit[i] == -1)
return false;
if (visit[i] == 1)
return true;
visit[i] = -1;
for (auto a : g[i])
{
if (!dfs(g, visit, a))
return false;
}
visit[i] = 1;
return true;
}
};
\ No newline at end of file
{
"type": "code_options",
"author": "CSDN.net",
"source": "solution.md",
"exercise_id": "faf3b0518667467b971e642c5ed5b077"
}
\ No newline at end of file
# 课程表
<p>你这个学期必须选修 <code>numCourses</code> 门课程,记为 <code>0</code> 到 <code>numCourses - 1</code></p>
<p>在选修某些课程之前需要一些先修课程。 先修课程按数组 <code>prerequisites</code> 给出,其中 <code>prerequisites[i] = [a<sub>i</sub>, b<sub>i</sub>]</code> ,表示如果要学习课程 <code>a<sub>i</sub></code><strong>必须</strong> 先学习课程  <code>b<sub>i</sub></code><sub> </sub></p>
<ul>
<li>例如,先修课程对 <code>[0, 1]</code> 表示:想要学习课程 <code>0</code> ,你需要先完成课程 <code>1</code></li>
</ul>
<p>请你判断是否可能完成所有课程的学习?如果可以,返回 <code>true</code> ;否则,返回 <code>false</code></p>
<p> </p>
<p><strong>示例 1:</strong></p>
<pre>
<strong>输入:</strong>numCourses = 2, prerequisites = [[1,0]]
<strong>输出:</strong>true
<strong>解释:</strong>总共有 2 门课程。学习课程 1 之前,你需要完成课程 0 。这是可能的。</pre>
<p><strong>示例 2:</strong></p>
<pre>
<strong>输入:</strong>numCourses = 2, prerequisites = [[1,0],[0,1]]
<strong>输出:</strong>false
<strong>解释:</strong>总共有 2 门课程。学习课程 1 之前,你需要先完成​课程 0 ;并且学习课程 0 之前,你还应先完成课程 1 。这是不可能的。</pre>
<p> </p>
<p><strong>提示:</strong></p>
<ul>
<li><code>1 <= numCourses <= 10<sup>5</sup></code></li>
<li><code>0 <= prerequisites.length <= 5000</code></li>
<li><code>prerequisites[i].length == 2</code></li>
<li><code>0 <= a<sub>i</sub>, b<sub>i</sub> < numCourses</code></li>
<li><code>prerequisites[i]</code> 中的所有课程对 <strong>互不相同</strong></li>
</ul>
<p>以下错误的选项是?</p>
## aop
### before
```cpp
#include <bits/stdc++.h>
using namespace std;
```
### after
```cpp
```
## 答案
```cpp
class Solution
{
public:
bool canFinish(int numCourses, vector<vector<int>> &prerequisites)
{
unordered_map<int, vector<int>> rels;
int *inDs = new int[numCourses];
for (int i = 0; i < numCourses; i++)
{
inDs[i] = 0;
vector<int> temp;
rels[i] = temp;
}
for (int i = 0; i < prerequisites.size(); i++)
{
rels[prerequisites[i][1]].push_back(prerequisites[i][0]);
inDs[prerequisites[i][0]]++;
}
queue<int> zeroInD;
int num = 0;
while (num != numCourses)
{
for (int i = 0; i < numCourses; i++)
{
if (inDs[i] == 0)
{
zeroInD.push(i);
num++;
inDs[i] = -1;
}
}
if (zeroInD.empty() && num != numCourses)
return false;
while (!zeroInD.empty())
{
int topV = zeroInD.front();
zeroInD.pop();
vector<int> topVEdges = rels[topV];
for (int j = 0; j < topVEdges.size(); j++)
{
inDs[topVEdges[j]]++;
}
}
}
if (num == numCourses)
return true;
else
return false;
}
};
```
## 选项
### A
```cpp
class Solution
{
public:
bool canFinish(int numCourses, vector<vector<int>> &prerequisites)
{
if (numCourses == 0)
return true;
vector<int> course(numCourses, 0);
vector<vector<int>> rela(numCourses);
for (int i = 0; i < prerequisites.size(); i++)
{
course[prerequisites[i][0]]++;
rela[prerequisites[i][1]].push_back(prerequisites[i][0]);
}
queue<int> cq;
for (int i = 0; i < numCourses; i++)
if (course[i] == 0)
cq.push(i);
int num = numCourses;
while (!cq.empty())
{
int c = cq.front();
cq.pop();
num--;
for (int i = 0; i < rela[c].size(); i++)
{
int this_course = rela[c][i];
course[this_course]--;
if (course[this_course] == 0)
cq.push(this_course);
}
}
return num == 0 ? true : false;
}
};
```
### B
```cpp
class Solution
{
public:
bool canFinish(int numCourses, vector<vector<int>> &prerequisites)
{
vector<int> res, degree(numCourses, 0);
unordered_map<int, vector<int>> map;
for (auto &e : prerequisites)
{
map[e[1]].push_back(e[0]);
degree[e[0]]++;
}
queue<int> q;
for (int i = 0; i < numCourses; i++)
{
if (degree[i] == 0)
{
q.push(i);
}
}
while (!q.empty())
{
int cur = q.front();
res.push_back(cur);
q.pop();
for (auto &next : map[cur])
{
degree[next]--;
if (degree[next] == 0)
q.push(next);
}
}
return res.size() == numCourses;
}
};
```
### C
```cpp
class Solution
{
public:
bool canFinish(int numCourses, vector<vector<int>> &prerequisites)
{
vector<vector<int>> graph(numCourses, vector<int>());
for (auto num : prerequisites)
{
graph[num[1]].push_back(num[0]);
}
vector<int> visit(numCourses);
for (int i = 0; i < numCourses; i++)
{
if (!dfs(graph, visit, i))
return false;
}
return true;
}
bool dfs(vector<vector<int>> &g, vector<int> &visit, int i)
{
if (visit[i] == -1)
return false;
if (visit[i] == 1)
return true;
visit[i] = -1;
for (auto a : g[i])
{
if (!dfs(g, visit, a))
return false;
}
visit[i] = 1;
return true;
}
};
```
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册