Medium
You are given an array of points in the X-Y plane points
where points[i] = [xi, yi]
.
Return the minimum area of a rectangle formed from these points, with sides parallel to the X and Y axes. If there is not any such rectangle, return 0
.
Example 1:
Input: points = [[1,1],[1,3],[3,1],[3,3],[2,2]]
Output: 4
Example 2:
Input: points = [[1,1],[1,3],[3,1],[3,3],[4,1],[4,3]]
Output: 2
Constraints:
1 <= points.length <= 500
points[i].length == 2
0 <= xi, yi <= 4 * 104
import kotlin.math.abs
class Solution {
fun minAreaRect(points: Array<IntArray>): Int {
if (points.size < 4) {
return 0
}
val map: MutableMap<Int, MutableSet<Int>> = HashMap()
for (p in points) {
map.putIfAbsent(p[0], HashSet())
map.getValue(p[0]).add(p[1])
}
points.sortWith { a: IntArray, b: IntArray ->
if (a[0] == b[0]) {
Integer.compare(
a[1],
b[1],
)
} else {
Integer.compare(a[0], b[0])
}
}
var min = Int.MAX_VALUE
for (i in 0 until points.size - 2) {
for (j in i + 1 until points.size - 1) {
val p1 = points[i]
val p2 = points[j]
val area = abs((p1[0] - p2[0]) * (p1[1] - p2[1]))
if (area >= min || area == 0) {
continue
}
if (map.getValue(p1[0]).contains(p2[1]) && map.getValue(p2[0]).contains(p1[1])) {
min = area
}
}
}
return if (min == Int.MAX_VALUE) 0 else min
}
}