https://leetcode-cn.com/problems/minimum-area-rectangle/
给定在 xy 平面上的一组点,确定由这些点组成的矩形的最小面积,其中矩形的边平行于 x 轴和 y 轴。
如果没有任何矩形,就返回 0。
示例 1:输入:[[1,1],[1,3],[3,1],[3,3],[2,2]] 输出:4
示例 2:输入:[[1,1],[1,3],[3,1],[3,3],[4,1],[4,3]] 输出:2
提示:
1 <= points.length <= 500
0 <= points[i][0] <= 40000
0 <= points[i][1] <= 40000
- 所有的点都是不同的。
思路:按照x轴进行排序,如果某个x对应的y值>=2个,那么有可能有用。形成一个柱子。
之后,按照两个柱子找交集(会自动排序,最小的矩形只会来自交集中相邻的两个),如果存在两个,则可以构成矩形,之后找最小的。
class Solution {
public:
int Inf=999999999;
static bool cmp(vector<int> a,vector<int> b) {
if(a[0]!=b[0])
return a[0]<b[0];
else return a[1]<b[1];
}
int minAreaRect(vector< vector<int> >& points) {
vector< vector<int> > vv;
vector<int> jl;
int n=points.size();
sort(points.begin(),points.end(),cmp);
int a;
for(int i=0; i<n; i++) {
int k=1;
a=points[i][0];
while(i+k<n&&a==points[i+k][0]) {
k++;
}
if(k>=2) {
vector<int> temp;
jl.push_back(a);
for(int j=0; j<k; j++)
temp.push_back(points[i+j][1]);
vv.push_back(temp);
i=i+k-1;
}
}
set<int> temp;
int N=vv.size();
int minArea=Inf;
set<int>::iterator it1,it2;
for(int i=0; i<N; i++) {
for(int j=i+1; j<N; j++) {
temp.clear();
set_intersection(vv[i].begin(),vv[i].end(),
vv[j].begin(),vv[j].end(),
inserter(temp, temp.begin()));
int iminrow=Inf;
if(temp.size()<2) continue;
for(it2=temp.begin(); it2!=temp.end(); it2++) {
it1=it2;
it1++;
if(it1!=temp.end())
iminrow=min(iminrow,*(it1)-*(it2));
//cout<<iminrow<<endl;
}
minArea=min(minArea,iminrow*(jl[j]-jl[i]));
}
}
return minArea==Inf?0:minArea;
}
};