一、Description
题目描述:
给定一些点集,找出由这些组成的面积最小的矩形,矩形的长和宽分别平行于x、y轴。如果不存在这样的矩形,返回0。
Example 1:
Input: [[1,1],[1,3],[3,1],[3,3],[2,2]] Output: 4
Example 2:
Input: [[1,1],[1,3],[3,1],[3,3],[4,1],[4,3]] Output: 2
二、Analyzation
定义一个map,key中存放每个点的横坐标,value为一个Set集合,存放的是横坐标等于key的所有纵坐标的集合。
遍历points,将所有的点放入map和对应的set中后,通过判断任意两个横坐标和纵坐标不相等的点A和B(AB构成一个矩形的对角线),如果A的横坐标对应的set中存在B的纵坐标而且B的横坐标对应的set中存在A的纵坐标,则存在一个矩形使得A、B为对角上的两个点,计算该矩形的面积并与min进行比较,最后返回min。
三、Accepted code
class Solution {
public int minAreaRect(int[][] points) {
if (null == points) {
return 0;
}
HashMap<Integer, HashSet<Integer>> map = new HashMap<>();
for (int i = 0; i < points.length; i++) {
int x = points[i][0];
int y = points[i][1];
if (!map.containsKey(x)) {
map.put(x, new HashSet<Integer>());
}
map.get(x).add(y);
}
int min = Integer.MAX_VALUE;
for (int[] p1 : points) {
for (int[] p2 : points) {
if (p1[0] == p2[0] || p1[1] == p2[1]) {
continue;
}
if (map.get(p1[0]).contains(p2[1]) && map.get(p2[0]).contains(p1[1])) {
min = Math.min(min, Math.abs(p1[0] - p2[0]) * Math.abs(p1[1] - p2[1]));
}
}
}
return min == Integer.MAX_VALUE ? 0 : min;
}
}