You are given an array points where points[i] = [xi, yi] represents the coordinates of a point on an infinite plane.
Your task is to find the maximum area of a rectangle that:
Can be formed using four of these points as its corners.
Does not contain any other point inside or on its border.
Has its edgesparallel to the axes.
Return the maximum area that you can obtain or -1 if no such rectangle is possible.
Example 1:
1 2 3
Input: points = [[1,1],[1,3],[3,1],[3,3]]
Output: 4
Explanation:
We can make a rectangle with these 4 points as corners and there is no other point that lies inside or on the border. Hence, the maximum possible area would be 4.
Example 2:
1 2 3
Input: points = [[1,1],[1,3],[3,1],[3,3],[2,2]]
Output: -1
Explanation:
There is only one rectangle possible is with points [1,1], [1,3], [3,1] and [3,3] but [2,2] will always lie inside it. Hence, returning -1.
The maximum area rectangle is formed by the points [1,3], [1,2], [3,2], [3,3], which has an area of 2. Additionally, the points [1,1], [1,2], [3,1], [3,2] also form a valid rectangle with the same area.
classSolution { public: intmaxRectangleArea(vector<vector<int>>& points){ int n = points.size(); int res = -1; for (int i = 0; i < n; i++) { for (int j = i + 1; j < n; j++) { for (int k = j + 1; k < n; k++) { for (int l = k + 1; l < n; l++) { unordered_set<int> checking = {i, j, k, l}; if (checkRectangle(checking, points)) { // cout << i << j << k << l << endl; res = max(res, noPointswithin(checking, points)); } } } } } return res; }
intnoPointswithin(unordered_set<int>& checking, vector<vector<int>>& points){ int n = points.size(); map<int, vector<int>> indexByX, indexByY; for (int i = 0; i < n; i++) { if (!checking.contains(i)) { continue; } int x = points[i][0], y = points[i][1]; indexByX[x].push_back(y); indexByY[y].push_back(x); } int x1 = indexByX.begin()->first, x2 = indexByX.rbegin()->first; int y1 = indexByY.begin()->first, y2 = indexByY.rbegin()->first; for (int i = 0; i < n; i++) { if (checking.contains(i)) { continue; } int x = points[i][0], y = points[i][1]; if (x >= x1 && x <= x2 && y >= y1 && y <= y2) { return-1; } } return (x2 - x1) * (y2 - y1); }
boolcheckRectangle(unordered_set<int>& checking, vector<vector<int>>& points){ int n = points.size(); unordered_map<int, vector<int>> indexByX, indexByY; for (int i = 0; i < n; i++) { if (!checking.contains(i)) { continue; } int x = points[i][0], y = points[i][1]; indexByX[x].push_back(y); indexByY[y].push_back(x); } if (indexByX.size() != 2 || indexByX.begin()->second.size() != 2) { returnfalse; } if (indexByY.size() != 2 || indexByY.begin()->second.size() != 2) { returnfalse; } returntrue; } };