Skip to content

Commit af274b8

Browse files
committed
add: Course Schedule II
1 parent dbacdf4 commit af274b8

File tree

1 file changed

+63
-63
lines changed

1 file changed

+63
-63
lines changed

src/course-schedule-ii/res.js

Lines changed: 63 additions & 63 deletions
Original file line numberDiff line numberDiff line change
@@ -24,69 +24,69 @@
2424
* @return {number[]}
2525
*/
2626
let findOrder = function(numCourses, prerequisites) {
27-
let prelen = prerequisites.length,
28-
maxNoCircle = numCourses * (numCourses - 1) / 2;
29-
// 当所有点都有边连接时, 最大的无环边数
30-
if (prelen > maxNoCircle) {
31-
return [];
32-
}
27+
let prelen = prerequisites.length,
28+
maxNoCircle = numCourses * (numCourses - 1) / 2;
29+
// 当所有点都有边连接时, 最大的无环边数
30+
if (prelen > maxNoCircle) {
31+
return [];
32+
}
3333

34-
let queue = [], // 存储 BFS 待访问节点序列
35-
flags = [], // 存储节点是否被访问过的标记
36-
res = [], //结果
37-
nodedegree = new Array(numCourses), // 存储node的连边总数
38-
edges = new Array(numCourses); // 存储连边信息, 每个元素中存储的数组表示自己的后续课程
39-
for (let i = 0; i < numCourses; i++) {
40-
flags[i] = false;
41-
nodedegree[i] = 0;
42-
edges[i] = [];
43-
}
34+
let queue = [], // 存储 BFS 待访问节点序列
35+
flags = [], // 存储节点是否被访问过的标记
36+
res = [], //结果
37+
nodedegree = new Array(numCourses), // 存储node的连边总数
38+
edges = new Array(numCourses); // 存储连边信息, 每个元素中存储的数组表示自己的后续课程
39+
for (let i = 0; i < numCourses; i++) {
40+
flags[i] = false;
41+
nodedegree[i] = 0;
42+
edges[i] = [];
43+
}
4444

45-
for (let i = 0; i < prelen; i++) {
46-
let source = prerequisites[i][0],
47-
target = prerequisites[i][1];
45+
for (let i = 0; i < prelen; i++) {
46+
let source = prerequisites[i][0],
47+
target = prerequisites[i][1];
4848

49-
edges[target].push(source);
50-
nodedegree[source]++;
51-
nodedegree[target]++;
52-
}
53-
54-
for (let i = 0; i < numCourses; i++) {
55-
if (nodedegree[i] === edges[i].length) {
56-
queue.push(i);
57-
}
58-
}
59-
60-
if (bfsVisit()) {
61-
return res;
62-
} else {
63-
return [];
64-
}
65-
66-
function bfsVisit() {
67-
while (queue.length) {
68-
let current = queue.shift(), //当前访问节点
69-
elen = edges[current].length; // 边数
70-
71-
res.push(current);
72-
// console.log(current, res);
73-
flags[current] = true;
74-
for (let i=0; i<elen; i++) {
75-
let target = edges[current][i];
76-
if (flags[target]) {
77-
return false; // 有回路,返回 false
78-
}
79-
if (--nodedegree[target] === edges[target].length) {
80-
queue.push(target);
81-
}
82-
}
83-
edges[current] = [];
84-
nodedegree[current] -= elen;
85-
}
86-
87-
if (res.length < numCourses) {
88-
return false;
89-
}
90-
return true;
91-
}
92-
};
49+
edges[target].push(source);
50+
nodedegree[source]++;
51+
nodedegree[target]++;
52+
}
53+
54+
for (let i = 0; i < numCourses; i++) {
55+
if (nodedegree[i] === edges[i].length) {
56+
queue.push(i);
57+
}
58+
}
59+
60+
if (bfsVisit()) {
61+
return res;
62+
} else {
63+
return [];
64+
}
65+
66+
function bfsVisit() {
67+
while (queue.length) {
68+
let current = queue.shift(), //当前访问节点
69+
elen = edges[current].length; // 边数
70+
71+
res.push(current);
72+
// console.log(current, res);
73+
flags[current] = true;
74+
for (let i = 0; i < elen; i++) {
75+
let target = edges[current][i];
76+
if (flags[target]) {
77+
return false; // 有回路,返回 false
78+
}
79+
if (--nodedegree[target] === edges[target].length) {
80+
queue.push(target);
81+
}
82+
}
83+
edges[current] = [];
84+
nodedegree[current] -= elen;
85+
}
86+
87+
if (res.length < numCourses) {
88+
return false;
89+
}
90+
return true;
91+
}
92+
};

0 commit comments

Comments
 (0)