注册一亩三分地论坛,查看更多干货!
您需要 登录 才可以下载或查看附件。没有帐号?注册账号
x
这道题类似于脑筋急转弯啊,最优解就是,利用矩形的两个对角线长度必然相等的特性,根据对角线长和中点位置做哈希存储。
- class Solution {
- private:
- unordered_map<string,vector<vector<int>>> mp;
- public:
- double minAreaFreeRect(vector<vector<int>>& points) {
- int n=points.size();
- for(int i=0;i<n;i++)
- {
- for(int j=i+1;j<n;j++)
- {
- int dx=points[i][0]-points[j][0];
- int dy=points[i][1]-points[j][1];
- long dist2=dx*dx+dy*dy;
- double cx=(points[i][0]+points[j][0])*0.5;
- double cy=(points[i][1]+points[j][1])*0.5;
- string s=to_string(dist2)+": "+to_string(cx)+", "+to_string(cy);
- mp[s].push_back({i,j});
- }
- }
- double min_area=1e15;
- for(auto it=mp.begin();it!=mp.end();it++)
- {
- if(it->second.size()<2) continue;
- //there could be multiple rectangle inside
- //now we have 4 points in diagonal, p0-p2 diagonal, p1-p3 diagonal
- vector<vector<int>>& vrect=it->second;
- for(int i=0;i<vrect.size();i++)
- {
- for(int j=i+1;j<vrect.size();j++)
- {
- int p0=vrect[i][0],p2=vrect[i][1];
- int p1=vrect[j][0],p3=vrect[j][1];
- int dx=points[p0][0]-points[p1][0];
- int dy=points[p0][1]-points[p1][1];
- long long dist01=dx*dx+dy*dy;
- dx=points[p0][0]-points[p3][0];
- dy=points[p0][1]-points[p3][1];
- long long dist03=dx*dx+dy*dy;
- double area=sqrt(double(dist01)*dist03);
- min_area=min(min_area,area);
- }
- }
- }
- return min_area==1e15?0:min_area;
- }
- };
复制代码
补充内容 (2018-12-24 08:59):
求加米! |