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 <= 50
points[i].length == 2
0 <= xi, yi <= 4 * 104
All the given points are unique.
Solutions
Solution 1: Hash Table + Enumeration
Thinking
The smallest area of a (possibly rotated) rectangle, \(n\le 50\), allows enumerating three vertices. With a right angle at \(p_1\), the fourth corner is the vector sum of the two edges.
The packed key \(x \times 40001 + y\) repeats once a coordinate leaves \([0, 4 \times 10^4]\), and the sum of two squared edges exceeds \(2^{31}-1\).
Inside that square the key is unique, and those squares fit in a 64-bit integer.
The fourth corner is accepted only when both coordinates lie in range and the key is present. Squared edge lengths are accumulated in 64 bits before the square root.
We use a hash table to store all the points, then enumerate three points \(p_1 = (x_1, y_1)\), \(p_2 = (x_2, y_2)\), \(p_3 = (x_3, y_3)\). If \(\overrightarrow{p_1p_2}\) and \(\overrightarrow{p_1p_3}\) are perpendicular, the fourth corner is \((x_4, y_4)=(x_2 - x_1 + x_3, y_2 - y_1 + y_3)\). Coordinates lie in \([0, 4 \times 10^4]\), and the packed key \(x \times 40001 + y\) is unique only inside that square, so this corner counts only when both coordinates fall in range and the key is present. The squared edge lengths are summed in 64-bit integers, since each sum can exceed \(2^{31}-1\), and the area is the square root of their product.
Finally, if a rectangle that satisfies the conditions is found, return the minimum area among them. Otherwise, return \(0\).
The time complexity is \(O(n^3)\), and the space complexity is \(O(n)\), where \(n\) is the length of the array \(\textit{points}\).