Skip to content

Commit 7808314

Browse files
committed
2097. Valid Arrangement of Pairs
1 parent adf0f8c commit 7808314

File tree

1 file changed

+56
-0
lines changed

1 file changed

+56
-0
lines changed
Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
// Solution by Sergey Leschev
2+
// 2097. Valid Arrangement of Pairs
3+
4+
// Time Complexity: O(m+n), where m == pairs.size(), and n is the number of nodes in the graph (the number of distinct numbers in pairs)
5+
// Space Complexity: O(m+n)
6+
7+
function validArrangement(pairs: number[][]): number[][] {
8+
const adj: Map<number, number[]> = new Map()
9+
const inDegree: Map<number, number> = new Map()
10+
const outDegree: Map<number, number> = new Map()
11+
12+
// Build adjacency list and in/out-degree maps
13+
for (const [u, v] of pairs) {
14+
if (!adj.has(u)) adj.set(u, [])
15+
adj.get(u)!.push(v)
16+
17+
outDegree.set(u, (outDegree.get(u) || 0) + 1)
18+
inDegree.set(v, (inDegree.get(v) || 0) + 1)
19+
}
20+
21+
// Find starting node
22+
let start = -1
23+
for (const [node] of adj) {
24+
const out = outDegree.get(node) || 0
25+
const inD = inDegree.get(node) || 0
26+
if (out - inD === 1) {
27+
start = node
28+
break
29+
}
30+
}
31+
32+
if (start === -1) {
33+
// Eulerian circuit: start from any node
34+
start = pairs[0][0]
35+
}
36+
37+
const result: number[][] = []
38+
const stack: number[] = [start]
39+
40+
// Perform Eulerian path
41+
while (stack.length > 0) {
42+
const curr = stack[stack.length - 1]
43+
44+
if (adj.has(curr) && adj.get(curr)!.length > 0) {
45+
const next = adj.get(curr)!.pop()!
46+
stack.push(next)
47+
} else {
48+
stack.pop()
49+
if (stack.length > 0) {
50+
result.push([stack[stack.length - 1], curr])
51+
}
52+
}
53+
}
54+
55+
return result.reverse()
56+
}

0 commit comments

Comments
 (0)