zoukankan      html  css  js  c++  java
  • 963. Minimum Area Rectangle II

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

    If there isn't any rectangle, return 0.

    Example 1:

    Input: [[1,2],[2,1],[1,0],[0,1]]
    Output: 2.00000
    Explanation: The minimum area rectangle occurs at [1,2],[2,1],[1,0],[0,1], with an area of 2.
    

    Example 2:

    Input: [[0,1],[2,1],[1,1],[1,0],[2,0]]
    Output: 1.00000
    Explanation: The minimum area rectangle occurs at [1,0],[1,1],[2,1],[2,0], with an area of 1.
    

    Example 3:

    Input: [[0,3],[1,2],[3,1],[1,3],[2,1]]
    Output: 0
    Explanation: There is no possible rectangle to form from these points.
    

    Example 4:

    Input: [[3,1],[1,1],[0,1],[2,1],[3,3],[3,2],[0,2],[2,3]]
    Output: 2.00000
    Explanation: The minimum area rectangle occurs at [2,1],[2,3],[3,3],[3,1], with an area of 2.

    Note:

    1. 1 <= points.length <= 50
    2. 0 <= points[i][0] <= 40000
    3. 0 <= points[i][1] <= 40000
    4. All points are distinct.
    5. Answers within 10^-5 of the actual value will be accepted as correct.

    Approach #1: Math. [Java]

    class Solution {
        public double minAreaFreeRect(int[][] points) {
            int len = points.length;
            if (len < 4) return 0.0;
            double ret = Double.MAX_VALUE;
            Map<String, List<int[]>> map = new HashMap<>();
            for (int i = 0; i < len; ++i) {
                for (int j = i+1; j < len; ++j) {
                    long diagonal = (points[i][0] - points[j][0]) * (points[i][0] - points[j][0]) + 
                                   (points[i][1] - points[j][1]) * (points[i][1] - points[j][1]);
                    double centerX = (double)(points[i][0] + points[j][0]) / 2;
                    double centerY = (double)(points[i][1] + points[j][1]) / 2;
                    String key = "" + diagonal + "+" + centerX + "+" + centerY;
                    if (map.get(key) == null) map.put(key, new ArrayList<int[]>());
                    map.get(key).add(new int[]{i, j});
                }
            }
            
            for (String key : map.keySet()) {
                List<int[]> list = map.get(key);
                if (list.size() < 2) continue;
                for (int i = 0; i < list.size(); ++i) {
                    for (int j = i+1; j < list.size(); ++j) {
                        int p1 = list.get(i)[0];
                        int p2 = list.get(j)[0];
                        int p3 = list.get(j)[1];
                        double x = Math.sqrt((points[p1][0] - points[p2][0]) * (points[p1][0] - points[p2][0]) 
                                        + (points[p1][1] - points[p2][1]) * (points[p1][1] - points[p2][1]));
                        double y = Math.sqrt((points[p1][0] - points[p3][0]) * (points[p1][0] - points[p3][0]) 
                                        + (points[p1][1] - points[p3][1]) * (points[p1][1] - points[p3][1]));
                        double area = x * y;
                        ret = Math.min(ret, area);                                                     
                    }
                }
            }
                                                                                                    
            return ret == Double.MAX_VALUE ? 0.0 : ret;
        }
    }
    

      

    Analysis:

    1. Two diagonals of a rectangle bisect each other, and are of equal length.

    2. The map's key is String including diagonal length and coordinate of the diagonal center; map's vlaue is the index of two points forming the diagonal.

    Reference:

    https://leetcode.com/problems/minimum-area-rectangle-ii/discuss/208361/JAVA-O(n2)-using-Map

    永远渴望,大智若愚(stay hungry, stay foolish)
  • 相关阅读:
    LSMW TIPS
    Schedule agreement and Delfor
    Running VL10 in the background 13 Oct
    analyse idoc by creation date
    New Journey Prepare
    EDI error
    CBSN NEWS
    Listen and Write 18th Feb 2019
    Microsoft iSCSI Software Target 快照管理
    通过 Microsoft iSCSI Software Target 提供存储服务
  • 原文地址:https://www.cnblogs.com/h-hkai/p/10920478.html
Copyright © 2011-2022 走看看