Skip to content

Commit 279caa1

Browse files
authored
Create 2097-valid-arrangement-of-pairs.js
1 parent 0a82b29 commit 279caa1

File tree

1 file changed

+36
-0
lines changed

1 file changed

+36
-0
lines changed

2097-valid-arrangement-of-pairs.js

+36
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
const packDGInOutDegreeMap = (gm, edges, dm) => { for (const [u, v] of edges) { if (!gm.has(u)) gm.set(u, []); gm.get(u).push(v); dm.set(u, (dm.get(u) || 0) + 1); dm.set(v, (dm.get(v) || 0) - 1); } };
2+
3+
/**
4+
* @param {number[][]} pairs
5+
* @return {number[][]}
6+
*/
7+
const validArrangement = (pairs) => {
8+
let g = new Map(), deg = new Map(), res = [];
9+
packDGInOutDegreeMap(g, pairs, deg);
10+
let start = -1;
11+
for (const [node, ] of deg) { // looking for starting node
12+
if (start == -1 || deg.get(node) == 1) start = node;
13+
}
14+
let path = eulerianPath(g, start);
15+
path.reverse();
16+
for (let i = 1; i < path.length; i++) {
17+
res.push([path[i-1], path[i]]);
18+
}
19+
return res;
20+
};
21+
22+
const eulerianPath = (g, start) => { // eulerian Path with Hierholzer’s Algorithm
23+
let st = [start], path = [];
24+
while (st.length) {
25+
let u = st[st.length - 1], ua = g.get(u) || [];
26+
if (ua.length) {
27+
let v = ua.pop();
28+
g.set(u, ua);
29+
st.push(v);
30+
} else {
31+
path.push(u);
32+
st.pop();
33+
}
34+
}
35+
return path;
36+
};

0 commit comments

Comments
 (0)