Kotlin || Union Find
188
class Solution {
    val parents = IntArray(1001)
    fun minCostConnectPoints(points: Array<IntArray>): Int {
        var ans = 0
        val edges = ArrayList<Pair<Pair<Int, Int>, Int>>()
        for (i in points.indices)
            parents[i] = i
        for (i in points.indices) {
            for (j in i+1..points.size-1)
                edges.add(Pair(Pair(i, j), getDist(points[i], points[j])))
        }
        edges.sortWith(Comparator<Pair<Pair<Int, Int>, Int>> { o1, o2 -> o1.second - o2.second })

        edges.forEach {
            if (union(it.first.first, it.first.second))
                ans += it.second
        }
        return ans
    }

    fun getDist(p1: IntArray, p2: IntArray): Int {
        return Math.abs(p1[0] - p2[0]) + Math.abs(p1[1] - p2[1])
    }

    fun union(u: Int, v: Int): Boolean {
        val p1 = find(u)
        val p2 = find(v)
        if (p1 != p2) {
            parents[p1] = p2
            return true
        }
        return false
    }

    private fun find(u: Int): Int {
        if (parents[u] != u)
            parents[u] = find(parents[u])
        return parents[u]
    }
}
Comments (0)