Skip to content

Commit a51a484

Browse files
committed
+ problem 207
1 parent 5a5adf3 commit a51a484

File tree

5 files changed

+178
-0
lines changed

5 files changed

+178
-0
lines changed
Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
# 207. Course Schedule
2+
There are a total of `numCourses` courses you have to take, labeled from `0` to `numCourses - 1`. You are given an array `prerequisites` where <code>prerequisites[i] = [a<sub>i</sub>, b<sub>i</sub>]</code> indicates that you **must** take course <code>b<sub>i</sub></code> first if you want to take course <code>a<sub>i</sub></code>.
3+
4+
* For example, the pair `[0, 1]`, indicates that to take course `0` you have to first take course `1`.
5+
6+
Return `true` if you can finish all courses. Otherwise, return `false`.
7+
8+
#### Example 1:
9+
<pre>
10+
<strong>Input:</strong> numCourses = 2, prerequisites = [[1,0]]
11+
<strong>Output:</strong> true
12+
<strong>Explanation:</strong> There are a total of 2 courses to take.
13+
To take course 1 you should have finished course 0. So it is possible.
14+
</pre>
15+
16+
#### Example 2:
17+
<pre>
18+
<strong>Input:</strong> numCourses = 2, prerequisites = [[1,0],[0,1]]
19+
<strong>Output:</strong> false
20+
<strong>Explanation:</strong> There are a total of 2 courses to take.
21+
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.
22+
</pre>
23+
24+
#### Constraints:
25+
* `1 <= numCourses <= 2000`
26+
* `0 <= prerequisites.length <= 5000`
27+
* `prerequisites[i].length == 2`
28+
* <code>0 <= a<sub>i</sub>, b<sub>i</sub> < numCourses</code>
29+
* All the pairs prerequisites[i] are **unique**.
30+
31+
## Solutions (Rust)
32+
33+
### 1. Solution
34+
```Rust
35+
use std::collections::HashMap;
36+
37+
impl Solution {
38+
pub fn can_finish(num_courses: i32, prerequisites: Vec<Vec<i32>>) -> bool {
39+
let mut indegrees = vec![0; num_courses as usize];
40+
let mut follows = HashMap::new();
41+
let mut courses = vec![];
42+
43+
for prerequisite in prerequisites {
44+
indegrees[prerequisite[0] as usize] += 1;
45+
follows
46+
.entry(prerequisite[1] as usize)
47+
.or_insert(vec![])
48+
.push(prerequisite[0] as usize);
49+
}
50+
51+
for b in 0..num_courses as usize {
52+
if indegrees[b] == 0 {
53+
courses.push(b);
54+
}
55+
}
56+
57+
while let Some(b) = courses.pop() {
58+
for a in follows.remove(&b).unwrap_or(vec![]) {
59+
indegrees[a] -= 1;
60+
if indegrees[a] == 0 {
61+
courses.push(a);
62+
}
63+
}
64+
}
65+
66+
indegrees.iter().all(|&x| x == 0)
67+
}
68+
}
69+
```
Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
# 207. 课程表
2+
你这个学期必须选修 `numCourses` 门课程,记为 `0``numCourses - 1`
3+
4+
在选修某些课程之前需要一些先修课程。 先修课程按数组 `prerequisites` 给出,其中 <code>prerequisites[i] = [a<sub>i</sub>, b<sub>i</sub>]</code> ,表示如果要学习课程 <code>a<sub>i</sub></code> 则 **必须** 先学习课程 <code>b<sub>i</sub></code> 。
5+
6+
* 例如,先修课程对 `[0, 1]` 表示:想要学习课程 `0` ,你需要先完成课程 `1`
7+
8+
请你判断是否可能完成所有课程的学习?如果可以,返回 `true` ;否则,返回 `false`
9+
10+
#### 示例 1:
11+
<pre>
12+
<strong>输入:</strong> numCourses = 2, prerequisites = [[1,0]]
13+
<strong>输出:</strong> true
14+
<strong>解释:</strong> 总共有 2 门课程。学习课程 1 之前,你需要完成课程 0 。这是可能的。
15+
</pre>
16+
17+
#### 示例 2:
18+
<pre>
19+
<strong>输入:</strong> numCourses = 2, prerequisites = [[1,0],[0,1]]
20+
<strong>输出:</strong> false
21+
<strong>解释:</strong> 总共有 2 门课程。学习课程 1 之前,你需要先完成课程 0 ;并且学习课程 0 之前,你还应先完成课程 1 。这是不可能的。
22+
</pre>
23+
24+
#### 提示:
25+
* `1 <= numCourses <= 2000`
26+
* `0 <= prerequisites.length <= 5000`
27+
* `prerequisites[i].length == 2`
28+
* <code>0 <= a<sub>i</sub>, b<sub>i</sub> < numCourses</code>
29+
* `prerequisites[i]` 中的所有课程对 **互不相同**
30+
31+
## 题解 (Rust)
32+
33+
### 1. 题解
34+
```Rust
35+
use std::collections::HashMap;
36+
37+
impl Solution {
38+
pub fn can_finish(num_courses: i32, prerequisites: Vec<Vec<i32>>) -> bool {
39+
let mut indegrees = vec![0; num_courses as usize];
40+
let mut follows = HashMap::new();
41+
let mut courses = vec![];
42+
43+
for prerequisite in prerequisites {
44+
indegrees[prerequisite[0] as usize] += 1;
45+
follows
46+
.entry(prerequisite[1] as usize)
47+
.or_insert(vec![])
48+
.push(prerequisite[0] as usize);
49+
}
50+
51+
for b in 0..num_courses as usize {
52+
if indegrees[b] == 0 {
53+
courses.push(b);
54+
}
55+
}
56+
57+
while let Some(b) = courses.pop() {
58+
for a in follows.remove(&b).unwrap_or(vec![]) {
59+
indegrees[a] -= 1;
60+
if indegrees[a] == 0 {
61+
courses.push(a);
62+
}
63+
}
64+
}
65+
66+
indegrees.iter().all(|&x| x == 0)
67+
}
68+
}
69+
```
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
use std::collections::HashMap;
2+
3+
impl Solution {
4+
pub fn can_finish(num_courses: i32, prerequisites: Vec<Vec<i32>>) -> bool {
5+
let mut indegrees = vec![0; num_courses as usize];
6+
let mut follows = HashMap::new();
7+
let mut courses = vec![];
8+
9+
for prerequisite in prerequisites {
10+
indegrees[prerequisite[0] as usize] += 1;
11+
follows
12+
.entry(prerequisite[1] as usize)
13+
.or_insert(vec![])
14+
.push(prerequisite[0] as usize);
15+
}
16+
17+
for b in 0..num_courses as usize {
18+
if indegrees[b] == 0 {
19+
courses.push(b);
20+
}
21+
}
22+
23+
while let Some(b) = courses.pop() {
24+
for a in follows.remove(&b).unwrap_or(vec![]) {
25+
indegrees[a] -= 1;
26+
if indegrees[a] == 0 {
27+
courses.push(a);
28+
}
29+
}
30+
}
31+
32+
indegrees.iter().all(|&x| x == 0)
33+
}
34+
}

README.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -140,6 +140,7 @@
140140
[204][204l] |[Count Primes][204] |![rs]
141141
[205][205l] |[Isomorphic Strings][205] |![py]
142142
[206][206l] |[Reverse Linked List][206] |![py]
143+
[207][207l] |[Course Schedule][207] |![rs]
143144
[208][208l] |[Implement Trie (Prefix Tree)][208] |![py]
144145
[209][209l] |[Minimum Size Subarray Sum][209] |![rs]
145146
[211][211l] |[Design Add and Search Words Data Structure][211] |![py]
@@ -1410,6 +1411,7 @@
14101411
[204]:Problemset/0204-Count%20Primes/README.md#204-count-primes
14111412
[205]:Problemset/0205-Isomorphic%20Strings/README.md#205-isomorphic-strings
14121413
[206]:Problemset/0206-Reverse%20Linked%20List/README.md#206-reverse-linked-list
1414+
[207]:Problemset/0207-Course%20Schedule/README.md#207-course-schedule
14131415
[208]:Problemset/0208-Implement%20Trie%20\(Prefix%20Tree\)/README.md#208-implement-trie-prefix-tree
14141416
[209]:Problemset/0209-Minimum%20Size%20Subarray%20Sum/README.md#209-minimum-size-subarray-sum
14151417
[211]:Problemset/0211-Design%20Add%20and%20Search%20Words%20Data%20Structure/README.md#211-design-add-and-search-words-data-structure
@@ -2675,6 +2677,7 @@
26752677
[204l]:https://leetcode.com/problems/count-primes/
26762678
[205l]:https://leetcode.com/problems/isomorphic-strings/
26772679
[206l]:https://leetcode.com/problems/reverse-linked-list/
2680+
[207l]:https://leetcode.com/problems/course-schedule/
26782681
[208l]:https://leetcode.com/problems/implement-trie-prefix-tree/
26792682
[209l]:https://leetcode.com/problems/minimum-size-subarray-sum/
26802683
[211l]:https://leetcode.com/problems/add-and-search-word-data-structure-design/

README_CN.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -140,6 +140,7 @@
140140
[204][204l] |[计数质数][204] |![rs]
141141
[205][205l] |[同构字符串][205] |![py]
142142
[206][206l] |[反转链表][206] |![py]
143+
[207][207l] |[课程表][207] |![rs]
143144
[208][208l] |[实现 Trie (前缀树)][208] |![py]
144145
[209][209l] |[长度最小的子数组][209] |![rs]
145146
[211][211l] |[添加与搜索单词 - 数据结构设计][211] |![py]
@@ -1410,6 +1411,7 @@
14101411
[204]:Problemset/0204-Count%20Primes/README_CN.md#204-计数质数
14111412
[205]:Problemset/0205-Isomorphic%20Strings/README_CN.md#205-同构字符串
14121413
[206]:Problemset/0206-Reverse%20Linked%20List/README_CN.md#206-反转链表
1414+
[207]:Problemset/0207-Course%20Schedule/README_CN.md#207-课程表
14131415
[208]:Problemset/0208-Implement%20Trie%20\(Prefix%20Tree\)/README_CN.md#208-实现-trie-前缀树
14141416
[209]:Problemset/0209-Minimum%20Size%20Subarray%20Sum/README_CN.md#209-长度最小的子数组
14151417
[211]:Problemset/0211-Design%20Add%20and%20Search%20Words%20Data%20Structure/README_CN.md#211-添加与搜索单词---数据结构设计
@@ -2675,6 +2677,7 @@
26752677
[204l]:https://leetcode.cn/problems/count-primes/
26762678
[205l]:https://leetcode.cn/problems/isomorphic-strings/
26772679
[206l]:https://leetcode.cn/problems/reverse-linked-list/
2680+
[207l]:https://leetcode.cn/problems/course-schedule/
26782681
[208l]:https://leetcode.cn/problems/implement-trie-prefix-tree/
26792682
[209l]:https://leetcode.cn/problems/minimum-size-subarray-sum/
26802683
[211l]:https://leetcode.cn/problems/add-and-search-word-data-structure-design/

0 commit comments

Comments
 (0)