1. 程式人生 > >LeetCode - Minimum Area Rectangle

LeetCode - Minimum Area Rectangle

Given a set of points in the xy-plane, determine the minimum area of a rectangle formed from these points, with sides parallel to the x and y axes.

If there isn't any rectangle, return 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 Note: 1 <= points.length <= 500 0 <= points[i][0] <= 40000 0 <= points[i][1] <= 40000 All points are distinct.

核心思想是利用對角線的原理定下兩個點,根據對角線在找到另外兩個點

如何把一個array pair存到hash裡,第一次我用了int -> string, 超時了

class Solution {
    public int minAreaRect(int[][] points) {
        if(points == null
|| points.length == 0 || points[0].length ==0){ return -1; } Set<String> set = new HashSet<>(); for(int[] point : points){ set.add(Integer.toString(point[0])+":"+Integer.toString(point[1])); } int min = Integer.MAX_VALUE;
for(int i = 0; i < points.length-1; i++){ for(int j = i+1; j < points.length; j++){ int [] pointA = points[i]; int [] pointB = points[j]; if(pointA[0] != pointB[0] && pointA[1] != pointB[1]){ if(set.contains(Integer.toString(pointA[0])+":"+Integer.toString(pointB[1])) && set.contains(Integer.toString(pointB[0])+":"+Integer.toString(pointA[1]))){ int cur = Math.abs((pointB[0] - pointA[0]) * (pointB[1] - pointA[1])); if(cur < min){ min = cur; } } } } } if(min == Integer.MAX_VALUE){ return 0; } return min; } }

第二次看了別人的程式碼, 原來可以按照把每一個pair的x存成key,y軸存成一個hashset。

class Solution {
    public int minAreaRect(int[][] points) {
        if(points == null || points.length == 0 || points[0].length ==0){
            return 0;
        }
        Map<Integer, Set<Integer>> map = new HashMap<>();
        for(int[] point : points){
            if(map.containsKey(point[0])){
                map.get(point[0]).add(point[1]);
            }
            else{
                Set<Integer> set = new HashSet<Integer>();
                set.add(point[1]);
                map.put(point[0], set);
            }
        }
        
        int min = Integer.MAX_VALUE;
        for(int i = 0; i < points.length-1; i++){
            for(int j = i+1; j < points.length; j++){
                int [] pointA = points[i];
                int [] pointB = points[j];
                if(pointA[0] != pointB[0] && pointA[1] != pointB[1]){
                    if(map.get(pointA[0]).contains(pointB[1]) && map.get(pointB[0]).contains(pointA[1])){
                        int cur = Math.abs((pointB[0] - pointA[0]) * (pointB[1] - pointA[1]));
                        if(cur < min){
                            min = cur;
                        }
                    }
                }
            }
        }
        if(min == Integer.MAX_VALUE){
            return 0;
        }
        return min;
    }
}