Skip to content

Commit 94a4e81

Browse files
Update
1 parent 07c0ded commit 94a4e81

22 files changed

+1367
-106
lines changed

README.md

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -74,8 +74,7 @@
7474

7575
* 编程语言
7676
* [C++面试&C++学习指南知识点整理](https://github.com/youngyangyang04/TechCPP)
77-
* [C++语言基础课](https://kamacoder.com/course.php?course_id=1)
78-
* [Java语言基础课](https://kamacoder.com/course.php?course_id=2)
77+
* [编程语言基础课](https://kamacoder.com/courseshop.php)
7978
* [23种设计模式](https://github.com/youngyangyang04/kama-DesignPattern)
8079

8180
* 工具
@@ -91,12 +90,12 @@
9190
* [BAT级别技术面试流程和注意事项都在这里了](./problems/前序/BAT级别技术面试流程和注意事项都在这里了.md)
9291

9392
* 算法性能分析
94-
* [关于时间复杂度,你不知道的都在这里!](./problems/前序/关于时间复杂度,你不知道的都在这里!.md)
95-
* [O(n)的算法居然超时了,此时的n究竟是多大?](./problems/前序/On的算法居然超时了,此时的n究竟是多大?.md)
96-
* [通过一道面试题目,讲一讲递归算法的时间复杂度!](./problems/前序/通过一道面试题目,讲一讲递归算法的时间复杂度!.md)
97-
* [关于空间复杂度,可能有几个疑问?](./problems/前序/关于空间复杂度,可能有几个疑问?.md)
93+
* [关于时间复杂度,你不知道的都在这里!](./problems/前序/时间复杂度.md)
94+
* [O(n)的算法居然超时了,此时的n究竟是多大?](./problems/前序/算法超时.md)
95+
* [通过一道面试题目,讲一讲递归算法的时间复杂度!](./problems/前序/递归算法的时间复杂度.md)
96+
* [关于空间复杂度,可能有几个疑问?](./problems/前序/空间复杂度.md)
9897
* [递归算法的时间与空间复杂度分析!](./problems/前序/递归算法的时间与空间复杂度分析.md)
99-
* [刷了这么多题,你了解自己代码的内存消耗么?](./problems/前序/刷了这么多题,你了解自己代码的内存消耗么?.md)
98+
* [刷了这么多题,你了解自己代码的内存消耗么?](./problems/前序/内存消耗.md)
10099

101100

102101
## 数组

problems/0207.课程表.md

Lines changed: 36 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -12,10 +12,6 @@
1212

1313
引用与任务调度,课程安排等等。
1414

15-
为什么
16-
17-
18-
-----
1915

2016
「拓扑排序」是专门应用于有向图的算法;
2117

@@ -26,32 +22,42 @@
2622
这道题的做法同样适用于第 210 题。
2723

2824

29-
```
30-
vector<int> inDegree(numCourses);
31-
unordered_map<int, vector<int>> map;
32-
for (int i = 0; i < prerequisites.size(); i++) {
33-
inDegree[prerequisites[i][0]]++;//当前课程入度值+1
34-
map[prerequisites[i][1]].push_back(prerequisites[i][0]);//添加依赖他的后续课
35-
}
36-
queue<int> Qu;
37-
for (int i = 0; i < numCourses; i++) {
38-
if (inDegree[i] == 0) Qu.push(i);//所有入度为0的课入列
39-
}
40-
int count = 0;
41-
while (Qu.size()) {
42-
int selected = Qu.front(); //当前选的课
43-
Qu.pop();//出列
44-
count++;//选课数+1
45-
vector<int> toEnQueue = map[selected];//获取这门课对应的后续课
46-
if (toEnQueue.size()) { //确实有后续课
47-
for (int i = 0; i < toEnQueue.size(); i++) {
48-
inDegree[toEnQueue[i]]--; //依赖它的后续课的入度-1
49-
if (inDegree[toEnQueue[i]] == 0) Qu.push(toEnQueue[i]); //如果因此减为0,入列
50-
}
51-
}
52-
}
53-
if (count == numCourses) return true;
54-
return false;
25+
```CPP
26+
class Solution {
27+
public:
28+
bool canFinish(int numCourses, vector<vector<int>>& prerequisites) {
29+
vector<int> inDegree(numCourses, 0);
30+
unordered_map<int, vector<int>> umap;
31+
for (int i = 0; i < prerequisites.size(); i++) {
32+
33+
// prerequisites[i][0] 是 课程入度,prerequisites[i][1] 是课程出度
34+
// 即: 上课prerequisites[i][0] 之前,必须先上课prerequisites[i][1]
35+
// prerequisites[i][1] -> prerequisites[i][0]
36+
inDegree[prerequisites[i][0]]++;//当前课程入度值+1
37+
umap[prerequisites[i][1]].push_back(prerequisites[i][0]); // 添加 prerequisites[i][1] 指向的课程
38+
}
39+
queue<int> que;
40+
for (int i = 0; i < numCourses; i++) {
41+
if (inDegree[i] == 0) que.push(i); // 所有入度为0,即为 开头课程 加入队列
42+
}
43+
int count = 0;
44+
while (que.size()) {
45+
int cur = que.front(); //当前选的课
46+
que.pop();
47+
count++; // 选课数+1
48+
vector<int> courses = umap[cur]; //获取这门课指向的课程,也就是这么课的后续课
49+
if (courses.size()) { // 有后续课
50+
for (int i = 0; i < courses.size(); i++) {
51+
inDegree[courses[i]]--; // 它的后续课的入度-1
52+
if (inDegree[courses[i]] == 0) que.push(courses[i]); // 如果入度为0,加入队列
53+
}
54+
}
55+
}
56+
if (count == numCourses) return true;
57+
return false;
58+
59+
}
60+
};
5561
```
5662
<p align="center">
5763
<a href="https://programmercarl.com/other/kstar.html" target="_blank">

problems/0210.课程表II.md

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
2+
```CPP
3+
class Solution {
4+
public:
5+
vector<int> findOrder(int numCourses, vector<vector<int>>& prerequisites) {
6+
vector<int> inDegree(numCourses, 0);
7+
vector<int> result;
8+
unordered_map<int, vector<int>> umap;
9+
for (int i = 0; i < prerequisites.size(); i++) {
10+
11+
// prerequisites[i][0] 是 课程入度,prerequisites[i][1] 是课程出度
12+
// 即: 上课prerequisites[i][0] 之前,必须先上课prerequisites[i][1]
13+
// prerequisites[i][1] -> prerequisites[i][0]
14+
inDegree[prerequisites[i][0]]++;//当前课程入度值+1
15+
umap[prerequisites[i][1]].push_back(prerequisites[i][0]); // 添加 prerequisites[i][1] 指向的课程
16+
}
17+
queue<int> que;
18+
for (int i = 0; i < numCourses; i++) {
19+
if (inDegree[i] == 0) que.push(i); // 所有入度为0,即为 开头课程 加入队列
20+
}
21+
int count = 0;
22+
while (que.size()) {
23+
int cur = que.front(); //当前选的课
24+
que.pop();
25+
count++; // 选课数+1
26+
result.push_back(cur);
27+
vector<int> courses = umap[cur]; //获取这门课指向的课程,也就是这么课的后续课
28+
if (courses.size()) { // 有后续课
29+
for (int i = 0; i < courses.size(); i++) {
30+
inDegree[courses[i]]--; // 它的后续课的入度-1
31+
if (inDegree[courses[i]] == 0) que.push(courses[i]); // 如果入度为0,加入队列
32+
}
33+
}
34+
}
35+
if (count == numCourses) return result;
36+
else return vector<int>();
37+
}
38+
};
39+
```

0 commit comments

Comments
 (0)