Leetcode963. Minimum Area Rectangle II最小面积矩形2
2024-09-04 07:18:56
给定在 xy 平面上的一组点,确定由这些点组成的任何矩形的最小面积,其中矩形的边不一定平行于 x 轴和 y 轴。
如果没有任何矩形,就返回 0。
示例 1:
输入:[[1,2],[2,1],[1,0],[0,1]] 输出:2.00000 解释:最小面积的矩形出现在 [1,2],[2,1],[1,0],[0,1] 处,面积为 2。
示例 2:
输入:[[0,1],[2,1],[1,1],[1,0],[2,0]] 输出:1.00000 解释:最小面积的矩形出现在 [1,0],[1,1],[2,1],[2,0] 处,面积为 1。
示例 3:
输入:[[0,3],[1,2],[3,1],[1,3],[2,1]] 输出:0 解释:没法从这些点中组成任何矩形。
示例 4:
输入:[[3,1],[1,1],[0,1],[2,1],[3,3],[3,2],[0,2],[2,3]] 输出:2.00000 解释:最小面积的矩形出现在 [2,1],[2,3],[3,3],[3,1] 处,面积为 2。
提示:
- 1 <= points.length <= 50
- 0 <= points[i][0] <= 40000
- 0 <= points[i][1] <= 40000
- 所有的点都是不同的。
- 与真实值误差不超过 10^-5 的答案将视为正确结果。
该题有很多需要注意的地方。
首先注意题目说的是矩形,而不是正方形。
然后 注意返回值是double型,所以我们要在题中使用double类型。
double类型是靠精度来比较的,而不是 ==
矩形的特征就是:对角线相等且平分
用其他方法要注意题中3个点在一条直线上的情况
这种多重循环的题,比如该题一般来说是n*n*n*n,我们可以优化成n*n*n。
const double esp = 1e-7;
class Solution {
public:
double minAreaFreeRect(vector<vector<int>>& points)
{
int len = points.size();
if (len < 4)
return 0;
double ans = -1;
map<pair<double, double>, bool> check;
for(int i = 0; i < len; i++)
{
check[make_pair(points[i][0], points[i][1])] = true;
}
for (int i = 0; i < len; i++)
{
double x1 = points[i][0], y1 = points[i][1];
for (int j = 0; j < len; j++)
{
if(i == j)
continue;
double x2 = points[j][0], y2 = points[j][1];
for (int k = 0; k < len; k++)
{
if(k == i || k == j)
continue;
double x3 = points[k][0], y3 = points[k][1];
double dis = GetDis(x1, y1, x2, y2);
//中点
double midx = (x1 + x2) * 1.0 / 2;
double midy = (y1 + y2) * 1.0 / 2;
if(abs(dis - GetDis(midx, midy, x3, y3) * 2) < esp)
{
double x4 = 2 * midx - x3;
double y4 = 2 * midy - y3;
if(check[make_pair(x4, y4)] == true)
{
double l = GetDis(x1, y1, x3, y3);
double w = GetDis(x1, y1, x4, y4);
double area = l * w;
ans = ans < 0? area : min(area, ans);
}
}
}
}
}
return ans < 0? 0 : ans;
}
//求距离
double GetDis(double x1, double y1, double x2, double y2)
{
return sqrt((x1 - x2)*(x1 - x2) + (y1 - y2)*(y1 - y2));
}
};
最新文章
- Nginx中的rewrite指令
- Mybatis学习记录(四)----resultMap的使用
- 消息队列系列(一):.Net平台下的消息队列介绍
- mysql 用sql语句查询一个表中的所有字段类型、注释
- SQO (标准查询运算符)方法 &; Linq To Object
- H.264 Quantization
- 类库dll引用不成功问题
- Qt try catch排错历程——C++的异常对除零不起作用
- RabbitMq install on Centos6.3
- Linux文件系统构成(第二版)
- VMware Workstation下安装Linux
- cdnbest站点里设置防盗链
- Week 2 代码规范
- Bitmap用来做大数据处理
- [No0000E4]C# 常量
- jetty 插件启动指定端口号
- 转 WiFi的STA和AP模式指什么?
- DevExpress控件汉化教程详解
- Java实现二分法排序
- 链表一元多项式计算器的实现(Java语言描述)
热门文章
- WPF 新突破
- Jmeter接口自动化测试:简单使用步骤
- Java笔记 &ndash; JDBC编程
- 常用终止python程序方法
- Newtonsoft.Json高级篇:TypeNameHandling设置
- 使用CEfSharp之旅(4)cefsharp 调用F12
- selenium基础(鼠标和键盘事件)
- typeerror: __init__() missing 2 required positional arguments: &#39;inputs&#39; and &#39;outputs&#39;
- Slim模型部署多GPU
- Activit单元i测试(与spring集成测试)