963. Minimum Area Rectangle II

T: O(n^3)

S: O(n)

class Solution {
    public double minAreaFreeRect(int[][] points) {
        int n = points.length;
        double area = Double.MAX_VALUE;
        Map<Integer, Set<Integer>> map = new HashMap<>();
        for (int[] p : points) {
            map.computeIfAbsent(p[0], k -> new HashSet<>()).add(p[1]);
        }
        for (int i = 0; i < n; i++) {
            for (int j = i+1; j < n; j++) {
                for (int k = j+1; k < n; k++) {
                    int dx1 = points[k][0] - points[i][0];
                    int dy1 = points[k][1] - points[i][1];
                    int dx2 = points[j][0] - points[i][0];
                    int dy2 = points[j][1] - points[i][1];

                    if (dy1*dy2 + dx1*dx2 == 0) {
                        int xl = points[j][0] + dx1;
                        int yl = points[j][1] + dy1;
                        if (map.containsKey(xl) && map.get(xl).contains(yl)) {
                            area = Math.min(area, Math.sqrt(dx1*dx1 + dy1*dy1) * Math.sqrt(dx2*dx2 + dy2*dy2));
                        }
                    }
                }
            }
        }
        return area == Double.MAX_VALUE ? 0 : area;
    }
}

/***
T: O(n^3)
S: O(n)

area = width*height

1. find 3 points fit to "dy1*dy2 + dx1*dx2 = 0;":

                    int dx1 = points[k][0] - points[i][0];
                    int dy1 = points[k][1] - points[i][1];
                    int dx2 = points[j][0] - points[i][0];
                    int dy2 = points[j][1] - points[i][1];
a. (yk - yi)*(yj - yi) + (xj - xi)*(xk - xi) = 0
dy1*dy2 + dx1*dx2 = 0; //  right angles(3 點 -> 兩個邊如果是直角) vector product = 0
  i
j.  k

b. then if we can find 4th point in hashmap

how to find 4th point => 
2 points in x, y -> diagnal intersect is the same 每兩個點的對角線交叉的點 是一樣的
so
   i
j.   k
   l

so we can say... xj xk 的中點, 和 xi xl (4th point) 的中點 是相等的
(xj + xk)/2 = (xi + xl)/2
so the 4th point is:
xl = xj + xk - xi = xj + dx1
yl = yj + dy1 -> and then check is it in map

c.
if we can find the 4th point, cal area
   i
j.   k
   l

a^2 + b^2 = c^2

(xk - xi)^2 + (yk - yi)^2 
=> 
width = sqrt(dx1^2 + dy1^2)
height = sqrt(dx2^2 + dy2^2) 

so area = sqrt(dx1^2 + dy1^2) * sqrt(dx2^2 + dy2^2) 
 */

Last updated