LeetCode-Minimum Area Rectangle

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Apple_hzc/article/details/83959501

一、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;
    }
}

猜你喜欢

转载自blog.csdn.net/Apple_hzc/article/details/83959501