Description
You are given an array of points in the X-Y plane points where points[i] = [xi, yi].
Return the minimum area of any rectangle formed from these points, with sides not necessarily parallel to the X and Y axes. If there is not any such rectangle, return 0.
Answers within 10-5 of the actual answer will be accepted.
Β
Example 1:
Input: points = [[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: points = [[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: points = [[0,3],[1,2],[3,1],[1,3],[2,1]] Output: 0 Explanation: There is no possible rectangle to form from these points.
Β
Constraints:
1 <= points.length <= 50points[i].length == 20 <= xi, yi <= 4 * 104- All the given points are unique.
 
Solution
Python3
class Solution:
    def minAreaFreeRect(self, points: List[List[int]]) -> float:
        n = len(points)
        res = float('inf')
        pos = set([(x, y) for x, y in points])
        
        def distance(x1, y1, x2, y2):
            return (x2 - x1) ** 2 + (y2 - y1) ** 2
        
        for i in range(n):
            x1, y1 = points[i]
            for j in range(i + 1, n):
                x2, y2 = points[j]
                for k in range(j + 1, n):
                    x3, y3 = points[k]
 
                    if distance(x2, y2, x3, y3) + distance(x1, y1, x3, y3) != distance(x1, y1, x2, y2): continue
                    
                    x4 = x1 + x2 - x3
                    y4 = y1 + y2 - y3
                    
                    if (x4, y4) not in pos: continue
                    
                    area = math.sqrt(distance(x1, y1, x3, y3)) * math.sqrt(distance(x2, y2, x3, y3))
                    
                    if area == 0: continue
                    
                    res = min(res, area)
        
                
        return res if res != float('inf') else 0