LeetCode939
问题:最小面积矩形
给定在 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 <= 5000 <= points[i][0] <= 400000 <= points[i][1] <= 40000- 所有的点都是不同的。
链接:https://leetcode-cn.com/contest/weekly-contest-110/problems/minimum-area-rectangle/
分析:
1.四个点构成一个矩形,其中左下坐标(x1,y1),右上坐标(x2,y2),则另外两个坐标为(x1,y2) (x2,y1)
2.可以逐一遍历所有点,得到以该点为左下角的最小面积,其其中的最小者。
3.获取以某个点为左下角的所有矩形最小面积时候,对于该点(x1,y1),先得到所有的(x1,ym)和(xn,y1),查看(xn,ym)是否在给出的点中,如果是则可以构成矩形,否则不可以,如果构成矩形,面积为(xn-x1)*(ym-y1)
4.对所有的(X1,y)和(x,Y1)排序后,假设选择了(x1,yi)和(xn,y1)两个点且(xn,yi)在给出的点中那么对于后续的(x1,yi+1)和(xn,y1)都不用看了,即使构成了矩形面积也大于(x1,yi),而且对于后续的(x1,yi+1)进行尝试的时候,只需要查看{(xm,y1),m<n}面积是否更小即可。

如图中所示,最小面积只能在(xi,yi)和(xi-,yi+)之中选择较小者。【对于固定的Xi,如果Yi能构成面积,Yi+即使能够成,得到的面积也会更大,而对于Yi+,如果X>Xi,则(X ,Yi)的面积必定大于(Xi,Yi)】
AC Code:
class Solution
{
public:
int minAreaRect(vector<vector<int>>& points)
{
int ret = INT_MAX;
sort(points.begin(), points.end());
for (int i = 0; i < points.size(); i++)
{
vector<vector<int> > getxs;
vector<vector<int> > getys;
//得到X值相同的点
getxs = GetXs(points, i+1, points[i]);
//得到Y值相同的点
getys = GetYs(points, i + 1, points[i]);
if (getxs.size() == 0 || getys.size() == 0)
{
continue;
}
int tmparea = GetMiniRect(points, getxs, getys, points[i]);
if (ret > tmparea)
{
ret = tmparea;
} }
if (ret == INT_MAX)
{
ret = 0;
}
return ret;
}
int GetMiniRect(vector<vector<int> > points, vector<vector<int> > Xs, vector<vector<int> > Ys, vector<int> startpoint)
{
int ret = INT_MAX;
vector<int> tmpx;
vector<int> tmpy;
//一条水平线上的,按照y排序
//sort(Xs.begin(), Xs.end(), cmpY);
//一条竖直线上的,按照x排序
//sort(Ys.begin(), Ys.end(), cmpX); int x1, y1, x2, y2;
x1 = startpoint[0];
y1 = startpoint[1]; int jend = Ys.size();
for (int i = 0; i < Xs.size(); i++)
{
y2 = Xs[i][1];
for (int j = 0; j < Ys.size() && j<jend; j++)
{
x2 = Ys[j][0];
vector<int> tmp = vector < int > {x2, y2};
if (std::find(points.begin(), points.end(), tmp) != points.end())
{
int local = (x2 - x1)*(y2 - y1);
if (ret > local)
{
ret = local;
}
jend = j;
break;
}
else
{
continue;
}
}
} return ret;
}
vector<vector<int> > GetXs(vector<vector<int> > points, int begin, vector<int> target)
{
vector<vector<int> > ret;
for (int i = begin; i < points.size(); i++)
{
if (points[i] == target)
{
continue;
}
if (points[i][0] == target[0] && points[i][1] > target[1])
{
ret.emplace_back(points[i]);
}
}
return ret;
}
vector<vector<int> > GetYs(vector<vector<int> > points, int begin, vector<int> target)
{
vector<vector<int> > ret;
for (int i = begin; i < points.size(); i++)
{
if (points[i] == target)
{
continue;
}
if (points[i][1] == target[1] && points[i][0] > target[0])
{
ret.emplace_back(points[i]);
}
}
return ret;
} };
其他:
1.对于多重vector,比如vector<vector<int> >执行sort函数后,会自动对所有元素都进行排序,即每个vector内部也会排序,做题的时候不确定这个,还特意编写自定义排序。
2.最开始考虑到(1X5 5X1 2X2)面积中2X2最小,做的是双重循环O(n*n)超时,考虑到沿着Y轴进行尝试,一旦得到一个矩形,X的上限就确定了,数据量大大减少
3.过程中遇到本地运行调试都对,提交提示内存地址对齐错误,最终发现是由于数字访问越界,而定位问题的方法则是提交试错:通过删减代码,定位到当有x2 = Ys[i][0];语句存在时候提交就会报这样的错误,实际上应该是x2 = Ys[j][0];。
LeetCode939的更多相关文章
- LeetCode939 最小面积矩形
LeetCode939最小面积矩形 给定在 xy 平面上的一组点,确定由这些点组成的矩形的最小面积,其中矩形的边平行于 x 轴和 y 轴. 如果没有任何矩形,就返回 0. Input [[1,1],[ ...
- [Swift]LeetCode939. 最小面积矩形 | Minimum Area Rectangle
Given a set of points in the xy-plane, determine the minimum area of a rectangle formed from these p ...
随机推荐
- Python-11-循环
x = 1 while x <= 100: print(x) x += 1 基本上, 可迭代对象是可使用for循环进行遍历的对象. numbers = [0, 1, 2, 3 ...
- 学习 primer 第8章 IO库 小结
iostream处理控制台IO fstream处理命名文件IO stringstream完成内存string的IO 非常重要!!!!!!!!!! ========================== ...
- css文本换行的问题
今天敲代码的时候发现了一个一直都没太注意的小问题,当我在一个200px的div中写了一长串的‘f ‘时发现没有换行 但加上空格或标点符号后就能自动换行 原来浏览器把它当成了一串完整的单词,所以默认不换 ...
- zk实现服务选举
非公平选举算法1)首先通过zk创建一个 /server 的PERSISTENT节点 2)多台机器同时创建 /server/leader EPHEMERAL子节点 3)子节点只能创建一个,后创建的会失败 ...
- 一个好用的压力测试工具tsung
一个好用的压力测试工具tsung 前段时间一直在忙各种事情,快三周没弄过引擎了,今天有点时间,正好之前写的服务器引擎也到了收尾测试的阶段,于是就研究了下怎么测试服务器压力. ...
- css文字与文本相关样式
css文字属性定义文本的字体系列,大小,加粗,风格和变形 font-family 设置字体系列 font-size 设置字体的尺寸 font-style ...
- html5 02 随记
HTML 02 全局通用属性 id name class style 一. 图像标签 标签名:<img /> 常用属性: Alt -- 代表图像的替代文字 作用: 当图片不显示的 ...
- informix服务端卸载后重新安装不成功
可能原因: 1.实例未删除 2.配置文件未删除 安装成功后远程客户端连接不上问题: 1..如果自己设置的数据库实例报错,换一个数据库实例(database)试试,例如sysadmin
- 记录下关于SQL server1433端口监听不了的问题
CMD命令netstat -an |findstr 1433,即使在防火墙的入站规则里添加了1433端口的访问,发现1433的端口还是监听不了. 搞了老半天,最终调整了MSSQESERVER的协议下的 ...
- BandwagonHost 5个数据中心/机房Ping速度测试亲自体验
我们选择Bandwagonhost服务器的原因之一在于有5个数据中心,而且与众多其他VPS不同之处在于可以自己后台切换机房和IP,这样我们 在遇到不满意的速度时候,可以自己切换其他机房更换,而且对于有 ...