Skip to content

Commit 56a3c4c

Browse files
committed
update for more clean
1 parent 679d909 commit 56a3c4c

File tree

3 files changed

+49
-56
lines changed

3 files changed

+49
-56
lines changed
Lines changed: 17 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,27 +1,27 @@
11
function findOrder(N: number, A: number[][]): number[] {
2-
const ret = [];
2+
const ret: number[] = [];
33

4-
// do topological sort using in-degree
4+
const indegree: number[] = Array.from({ length: N }, () => 0);
5+
const adjG: number[][] = Array.from<any, number[]>({ length: N }, () => []);
56

6-
const degree = Array.from({ length: N }, () => 0); // indegree
7-
const adj: number[][] = Array.from({ length: N }, () => []);
8-
9-
for (const [from, to] of A) {
10-
degree[to]++;
11-
adj[from].push(to);
7+
for (const [F, L] of A) {
8+
indegree[F]++;
9+
adjG[F].push(L);
10+
adjG[L].push(F);
1211
}
1312

14-
// topological sort
15-
1613
for (let i = 0; i < N; i++) {
17-
const node = degree.findIndex((val) => val === 0);
18-
if (node === -1) return []; // impossible to finish
14+
const zeroDegreeIdx = indegree.findIndex((deg) => deg === 0);
1915

20-
degree[node]--; // de-dup
21-
ret.push(node);
16+
if (zeroDegreeIdx === -1) return [];
2217

23-
for (const next of adj[node]) degree[next]--;
24-
}
18+
ret.push(zeroDegreeIdx);
19+
indegree[zeroDegreeIdx]--; // de-dup;
2520

26-
return ret.reverse();
21+
// relax adj
22+
for (const adj of adjG[zeroDegreeIdx]) {
23+
indegree[adj]--;
24+
}
25+
}
26+
return ret;
2727
}
Lines changed: 23 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,32 +1,31 @@
1-
function checkIfPrerequisite(
2-
numCourses: number,
3-
prerequisites: number[][],
4-
queries: number[][]
5-
): boolean[] {
6-
const N = numCourses;
7-
const degree = Array.from({ length: N }, () => 0); // collect the outdegree;
8-
const graph: number[][] = Array.from({ length: N }, () => []); // coleect avl incoming node;
9-
const preSet: Set<number>[] = Array.from({ length: N }, () => new Set());
10-
for (const pair of prerequisites) {
11-
const [from, to] = pair;
12-
graph[to].push(from);
13-
degree[from]++;
1+
function checkIfPrerequisite(N: number, A: number[][], queries: number[][]): boolean[] {
2+
const degree = Array.from({ length: N }, () => 0);
3+
const adjG = Array.from<any, number[]>({ length: N }, () => []);
4+
5+
for (const [F, L] of A) {
6+
degree[F]++;
7+
// adjG[F].push(L); --> only record direct graph to prevent break the inherit logic
8+
adjG[L].push(F);
149
}
1510

16-
// start from out degree 0 and keep collect the prerequisites
11+
const sets = Array.from({ length: N }, () => new Set());
12+
1713
for (let i = 0; i < N; i++) {
18-
const start = degree.findIndex((val) => val === 0);
14+
const start = degree.findIndex((deg) => deg === 0);
1915
if (start === -1) break;
20-
degree[start]--;
21-
const queue = Array.from(graph[start]);
22-
while (queue.length !== 0) {
23-
const node = queue.shift()!;
24-
degree[node]--;
25-
preSet[node].add(start);
26-
for (const key of preSet[start]) {
27-
preSet[node].add(key);
16+
17+
degree[start]--; // de-dup;
18+
19+
for (const adj of adjG[start]) {
20+
degree[adj]--;
21+
sets[adj].add(start);
22+
23+
// inherit the parent node's parents
24+
for (const key of sets[start]) {
25+
sets[adj].add(key);
2826
}
2927
}
3028
}
31-
return queries.map((pair) => preSet[pair[0]].has(pair[1]));
29+
30+
return queries.map(([p1, p2]) => sets[p1].has(p2));
3231
}
Lines changed: 9 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,26 +1,20 @@
11
function canFinish(N: number, A: number[][]): boolean {
2-
// keep the in-degree state, and do the topological sort (relax the degree 0)
3-
4-
// initial in-degree state / adj graph
52
const degree = Array.from({ length: N }, () => 0);
6-
const adj: number[][] = Array.from({ length: N }, () => []);
3+
const adjG: number[][] = Array.from({ length: N }, () => []);
74

8-
for (const [from, to] of A) {
9-
degree[to]++;
10-
adj[from].push(to);
5+
for (const [F, L] of A) {
6+
degree[F]++;
7+
adjG[F].push(L);
8+
adjG[L].push(F);
119
}
1210

13-
// do topological sort
1411
for (let i = 0; i < N; i++) {
15-
// find the zero degree node
16-
const node = degree.findIndex((val) => val === 0);
17-
if (node === -1) return false;
12+
const zDeg = degree.findIndex((deg) => deg === 0);
13+
if (zDeg === -1) return false;
1814

19-
degree[node]--; // de-dup
15+
degree[zDeg]--; // de-dup
2016

21-
for (const to of adj[node]) {
22-
degree[to]--;
23-
}
17+
for (const adj of adjG[zDeg]) degree[adj]--; // relax adjacent nodes
2418
}
2519
return true;
2620
}

0 commit comments

Comments
 (0)