Min Cost to Connect All Points
Description
You are given an array points
representing integer coordinates of some points on a 2D-plane, where points[i] = [xi, yi]
.
The cost of connecting two points [xi, yi]
and [xj, yj]
is the manhattan distance between them: |xi - xj| + |yi - yj|
, where |val|
denotes the absolute value of val
.
Return the minimum cost to make all points connected. All points are connected if there is exactly one simple path between any two points.
Example 1:
Input: points = [[0,0],[2,2],[3,10],[5,2],[7,0]] Output: 20 Explanation: We can connect the points as shown above to get the minimum cost of 20. Notice that there is a unique path between every pair of points.
Example 2:
Input: points = [[3,12],[-2,5],[-4,1]] Output: 18
Example 3:
Input: points = [[0,0],[1,1],[1,0],[-1,1]] Output: 4
Example 4:
Input: points = [[-1000000,-1000000],[1000000,1000000]] Output: 4000000
Example 5:
Input: points = [[0,0]] Output: 0
Constraints:
1 <= points.length <= 1000
-106 <= xi, yi <= 106
- All pairs
(xi, yi)
are distinct.
Solution(javascript)
/**
* @param {number[][]} points
* @return {number}
*/
const minCostConnectPoints = function (points) {
const distance = (p1, p2) => Math.abs(p1[0] - p2[0]) + Math.abs(p1[1] - p2[1])
const arr = []
for (let i = 0; i < points.length; i++) {
for (let j = i + 1; j < points.length; j++) {
const d = distance(points[i], points[j])
arr.push([i, j, d])
}
}
arr.sort((a, b) => a[2] - b[2])
const parents = points.map((x, index) => index)
const root = (a) => {
while (parents[a] !== parents[parents[a]]) {
parents[a] = parents[parents[a]]
}
return parents[a]
}
const isConnected = (a, b) => root(a) === root(b)
const union = (a, b) => {
const rootA = root(a)
const rootB = root(b)
parents[rootA] = rootB
}
let result = 0
for (const [a, b, cost] of arr) {
if (!isConnected(a, b)) {
result += cost
union(a, b)
}
}
return result
}