kt: add «2097. Valid Arrangement of Pairs»
URL: https://leetcode.com/problems/valid-arrangement-of-pairs/ Signed-off-by: Matej Focko <me@mfocko.xyz>
This commit is contained in:
parent
f878952bbc
commit
03db4fc1c3
1 changed files with 56 additions and 0 deletions
56
kt/valid-arrangement-of-pairs.kt
Normal file
56
kt/valid-arrangement-of-pairs.kt
Normal file
|
@ -0,0 +1,56 @@
|
||||||
|
class Solution {
|
||||||
|
private data class Graph(
|
||||||
|
val neighbors: Map<Int, ArrayDeque<Int>>,
|
||||||
|
val ingoing: Map<Int, Int>,
|
||||||
|
val outgoing: Map<Int, Int>,
|
||||||
|
)
|
||||||
|
|
||||||
|
private fun constructGraph(pairs: Array<IntArray>): Graph {
|
||||||
|
val neighbors = mutableMapOf<Int, ArrayDeque<Int>>()
|
||||||
|
val ingoing = mutableMapOf<Int, Int>()
|
||||||
|
val outgoing = mutableMapOf<Int, Int>()
|
||||||
|
|
||||||
|
pairs.forEach { pair ->
|
||||||
|
val (left, right) = pair[0] to pair[1]
|
||||||
|
|
||||||
|
neighbors.getOrPut(left) { ArrayDeque<Int>() }.add(right)
|
||||||
|
outgoing[left] = 1 + outgoing.getOrDefault(left, 0)
|
||||||
|
ingoing[right] = 1 + ingoing.getOrDefault(right, 0)
|
||||||
|
}
|
||||||
|
|
||||||
|
return Graph(neighbors, ingoing, outgoing)
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun findStart(g: Graph): Int =
|
||||||
|
g.outgoing.keys.firstOrNull {
|
||||||
|
g.outgoing[it] == 1 + g.ingoing.getOrDefault(it, 0)
|
||||||
|
} ?: g.outgoing.keys.first()
|
||||||
|
|
||||||
|
private fun visit(
|
||||||
|
g: Graph,
|
||||||
|
path: MutableList<Int>,
|
||||||
|
u: Int,
|
||||||
|
) {
|
||||||
|
val neighbors = g.neighbors.getOrDefault(u, null)
|
||||||
|
while (neighbors != null && neighbors.isNotEmpty()) {
|
||||||
|
val v = neighbors.removeFirst()
|
||||||
|
visit(g, path, v)
|
||||||
|
}
|
||||||
|
|
||||||
|
path.add(u)
|
||||||
|
}
|
||||||
|
|
||||||
|
fun validArrangement(pairs: Array<IntArray>): Array<IntArray> {
|
||||||
|
val g = constructGraph(pairs)
|
||||||
|
val start = findStart(g)
|
||||||
|
|
||||||
|
val path = mutableListOf<Int>()
|
||||||
|
visit(g, path, start)
|
||||||
|
|
||||||
|
path.reverse()
|
||||||
|
|
||||||
|
return Array(path.size - 1) { i ->
|
||||||
|
intArrayOf(path[i], path[i + 1])
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in a new issue