题目描述
给定在 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
- 所有的点都是不同的。
解题思路
每次选择两个点看作对角线上的点,然后查找另外两个点是否在points中,如果在,计算构成举行的面积,否则不做处理;一开始对于查找另外两个点没有想到好的解决办法,时间复杂度O(N)去查找,参考评论区大佬的解决办法,使用set实现O(logN)时间复杂度查找(获得的小小启示是,对于优化O(N)到O(logN)的问题,可以考虑使用set或map辅助)
int minAreaRect(vector<vector<int>>& points) {
set<int> st;
int minArea = INT_MAX;
int trans = 40000;
int len = points.size();
for(int i=0;i<len;i++){
int x1 = points[i][0],y1 = points[i][1];
for(int j=0;j<len;j++){
int x2 = points[j][0],y2 = points[j][1];
if(x1 == x2 || y1 == y2) continue;
if((st.find(x1*trans+y2)!=st.end()) && (st.find(x2*trans+y1)!=st.end())){
minArea = min(minArea,abs((x1-x2)*(y1-y2)));
}
}
st.insert(x1*trans+y1);
}
return (minArea==INT_MAX)?0:minArea;
}