LeetCode939 最小面積矩形
阿新 • • 發佈:2018-11-12
LeetCode939最小面積矩形
給定在 xy 平面上的一組點,確定由這些點組成的矩形的最小面積,其中矩形的邊平行於 x 軸和 y 軸。
如果沒有任何矩形,就返回 0。
Input
[[1,1],[1,3],[3,1],[3,3],[2,2]]
Output
4
hint
- 1 <= points.length <= 500
- 0 <= points[i][0] <= 40000
- 0 <= points[i][1] <= 40000
- 所有的點都是不同的。
題目大意
給許多點找出4個點構成矩形,求最小面積是多少,沒有輸出0
題目思路
考慮兩個對角的點可以確定一個矩形。那麼我們列舉兩個對角點,再去判斷矩形另外兩個點是否存在。
列舉複雜度O(n^2)判斷是否存在用map O(log(n))
複雜度O(log(n)*n^2) n = 500
下面給出AC程式碼
class Solution { public: map<pair<int,int>,int>mmp; int getArea(int x1,int y1,int x2,int y2) { if(mmp[make_pair(x1,y2)]&&mmp[make_pair(x2,y1)]) { return (x2-x1)*(y2-y1); } else { return -1; } } int minAreaRect(vector<vector<int>>& points) { int f = 0,Min = 0; for(int i=0; i<points.size(); i++) mmp[make_pair(points[i][0],points[i][1])]++; for(int i=0; i<points.size(); i++) { for(int j=i+1; j<points.size(); j++) { int x1 = points[i][0],x2 =points[j][0],y1 = points[i][1],y2 =points[j][1]; if(x1==x2||y1==y2) continue; if(x1>x2&&y1>y2) { int area = getArea(x2,y2,x1,y1); if(area==-1) continue; if(f) Min = min(area,Min); else Min = area,f=1; } else if(x1<x2&&y1<y2) { int area = getArea(x1,y1,x2,y2); if(area==-1) continue; if(f) Min = min(area,Min); else Min = area,f=1; } else if(x1<x2&&y1>y2) { if(mmp[make_pair(x2,y1)]&&mmp[make_pair(x1,y2)]) { if(f) Min = min((y1-y2)*(x2-x1),Min); else Min = (y1-y2)*(x2-x1),f=1; } } else { if(mmp[make_pair(x2,y1)]&&mmp[make_pair(x1,y2)]) { if(f) Min = min((y2-y1)*(x1-x2),Min); else Min = (y2-y1)*(x1-x2),f=1; } } } } return f?Min:0; } };