Skip to content

Commit 3a2a24f

Browse files
committed
feat(book/pq): add exercise with pq and dijkstra
1 parent f248e42 commit 3a2a24f

File tree

2 files changed

+93
-21
lines changed

2 files changed

+93
-21
lines changed

Diff for: book/interview-questions/network-delay-time.js

+48-19
Original file line numberDiff line numberDiff line change
@@ -1,28 +1,57 @@
1-
// https://leetcode.com/problems/network-delay-time/solution/
2-
function networkDelayTime(times: number[][], N: number, K: number): number {
3-
const graph = new Map<number, [number, number][]>(Array(N).fill(0).map((_, i) => [i + 1, []]));
4-
times.forEach(([u, v, w]) => graph.get(u)?.push([v, w]));
1+
const { PriorityQueue, Queue } = require('../../src/index');
52

6-
const queue = new Queue([[K, 0]]);
7-
const seen = Array(N + 1).fill(Infinity);
3+
// tag::description[]
4+
function networkDelayTime(times, N, K) {
5+
// end::description[]
6+
// tag::placeholder[]
7+
// write your code here...
8+
// end::placeholder[]
9+
// tag::solution[]
10+
const graph = new Map(Array(N).fill(0).map((_, i) => [i + 1, []]));
11+
times.forEach(([u, v, w]) => graph.get(u).push([v, w]));
812

9-
while (queue.size()) {
10-
const [node, dist] = queue.dequeue();
11-
seen[node] = Math.min(seen[node], dist);
13+
const q = new PriorityQueue([[0, K]]);
14+
const dist = new Map();
1215

13-
for (const [adj, w] of graph.get(node) || []) {
14-
if (seen[adj] > dist + w) queue.enqueue([adj, dist + w]);
16+
while (q.size) {
17+
const [d, n] = q.dequeue();
18+
19+
if (dist.has(n)) continue;
20+
dist.set(n, d);
21+
22+
for (const [adj, w] of graph.get(n)) {
23+
if (!dist.has(adj)) q.enqueue([d + w, adj]);
1524
}
1625
}
1726

18-
const max = Math.max(...seen.slice(1));
19-
return max === Infinity ? -1 : max;
20-
};
27+
return dist.size === N ? Math.max(...dist.values()) : -1;
28+
// end::solution[]
29+
// tag::description[]
30+
}
31+
// end::description[]
32+
33+
// tag::networkDelayTimeQueue[]
34+
function networkDelayTimeQueue(times, N, K) {
35+
const graph = new Map(Array(N).fill(0).map((_, i) => [i + 1, []]));
36+
times.forEach(([u, v, w]) => graph.get(u).push([v, w]));
37+
38+
const q = new Queue([[0, K]]);
39+
const dist = new Map();
2140

22-
/*
23-
[[2,1,1],[2,3,1],[3,4,1]]
24-
4
25-
2
41+
while (q.size) {
42+
const [d, n] = q.dequeue();
43+
44+
dist.set(n, dist.has(n) ? Math.min(dist.get(n), d) : d);
45+
46+
for (const [adj, w] of graph.get(n)) {
47+
if (!dist.has(adj) || dist.get(adj) > d + w) {
48+
q.enqueue([d + w, adj]);
49+
}
50+
}
51+
}
2652

53+
return dist.size === N ? Math.max(...dist.values()) : -1;
54+
}
55+
// end::networkDelayTimeQueue[]
2756

28-
*/
57+
module.exports = { networkDelayTime, networkDelayTimeQueue };

Diff for: book/interview-questions/network-delay-time.spec.js

+45-2
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)