【leetcode】963. Minimum Area Rectangle II
题目如下:
Given a set of points in the xy-plane, determine the minimum area of any rectangle formed from these points, with sides not necessarily parallel to the x and y axes.
If there isn't any rectangle, return 0.
Example 1:
Input: [[1,2],[2,1],[1,0],[0,1]]
Output: 2.00000
Explanation: The minimum area rectangle occurs at [1,2],[2,1],[1,0],[0,1], with an area of 2.Example 2:
Input: [[0,1],[2,1],[1,1],[1,0],[2,0]]
Output: 1.00000
Explanation: The minimum area rectangle occurs at [1,0],[1,1],[2,1],[2,0], with an area of 1.Example 3:
Input: [[0,3],[1,2],[3,1],[1,3],[2,1]]
Output: 0
Explanation: There is no possible rectangle to form from these points.Example 4:
Input: [[3,1],[1,1],[0,1],[2,1],[3,3],[3,2],[0,2],[2,3]]
Output: 2.00000
Explanation: The minimum area rectangle occurs at [2,1],[2,3],[3,3],[3,1], with an area of 2.Note:
1 <= points.length <= 500 <= points[i][0] <= 400000 <= points[i][1] <= 40000- All points are distinct.
- Answers within
10^-5of the actual value will be accepted as correct.
解题思路:本题是【leetcode】939. Minimum Area Rectangle 的升级版,由于题目要求矩形不需要和X轴或者Y轴平行,因此我的解法就是简单粗暴。从points中任意取出四个点判断是否是矩形,这样的话时间复杂度是O(n^4),虽然points.length最大只有50,但还是华丽丽的超时。 那就优化吧,我们可以以边为单位,假设两条边要组成矩形平行的边,那么这两条边的长度一定是相同的,所以可以实现把任意两个点组成的边的长度都计算出来,接下来再从长度相同的两条边中判断是否组成矩形,时间复杂度就降为O(n^2)了,和【leetcode】4Sum 的思路非常相似。如果两条边的长度相同,怎么判断是否能组成矩形呢,那就用勾股定理了,取这两条边的任意一点,分别计算出与其他三点的距离,判断是否满足勾股定理。看起来似乎是这样,但是有如下这种情况,红框点到两个绿框点的距离与红框点到蓝框点的距离是满足勾股定理的,但实际上这四个点并没有组成矩形。所以找出了四个点后,不能只判断其中一个点与其他三个点的距离,至少应该取其中两个来做判断(感觉是这样,但我不确定,所以我取了三个点判断),最后求出最小的面积即可。

代码如下:
class Solution(object):
def minAreaFreeRect(self, points):
"""
:type points: List[List[int]]
:rtype: float
"""
def dis(p1, p2):
return (p1[0] - p2[0]) ** 2 + (p1[1] - p2[1]) ** 2
dic = {}
res = float('inf')
for i in range(len(points)):
for j in range(i+1,len(points)):
d = dis(points[i], points[j])
if d not in dic:
dic[d] = [(i,j)]
else:
dic[d].append((i,j))
for pl in dic.itervalues():
for i in range(len(pl)):
for j in range(i + 1, len(pl)):
if len(set(pl[i]) & set(pl[j])) > 0:
continue
p1,p2,p3,p4 = pl[i][0],pl[i][1],pl[j][0],pl[j][1]
d1 = dis(points[p1], points[p2])
d2 = dis(points[p1], points[p3])
d3 = dis(points[p1], points[p4])
dl = sorted([d1, d2, d3])
if dl[0] + dl[1] != dl[2]:
continue d1 = dis(points[p2], points[p1])
d2 = dis(points[p2], points[p3])
d3 = dis(points[p2], points[p4])
dl = sorted([d1, d2, d3])
if dl[0] + dl[1] != dl[2]:
continue d1 = dis(points[p3], points[p1])
d2 = dis(points[p3], points[p2])
d3 = dis(points[p3], points[p4])
dl = sorted([d1, d2, d3])
if dl[0] + dl[1] != dl[2]:
continue res = min(res, dl[0] * dl[1]) if res == float('inf'):
res = 0
import math
return math.sqrt(res)
【leetcode】963. Minimum Area Rectangle II的更多相关文章
- 【LeetCode】963. Minimum Area Rectangle II 解题报告(Python)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 线段长+线段中心+字典 日期 题目地址:https: ...
- 【LeetCode】939. Minimum Area Rectangle 解题报告(Python & C++)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 确定对角线,找另外两点(4sum) 字典保存出现的x ...
- 【leetcode】939. Minimum Area Rectangle
题目如下: Given a set of points in the xy-plane, determine the minimum area of a rectangle formed from t ...
- 963. Minimum Area Rectangle II
Given a set of points in the xy-plane, determine the minimum area of any rectangle formed from these ...
- LC 963. Minimum Area Rectangle II
Given a set of points in the xy-plane, determine the minimum area of any rectangle formed from these ...
- 【LeetCode】522. Longest Uncommon Subsequence II 解题报告(Python)
[LeetCode]522. Longest Uncommon Subsequence II 解题报告(Python) 标签(空格分隔): LeetCode 作者: 负雪明烛 id: fuxuemin ...
- 【LeetCode】452. Minimum Number of Arrows to Burst Balloons 解题报告(Python)
[LeetCode]452. Minimum Number of Arrows to Burst Balloons 解题报告(Python) 标签(空格分隔): LeetCode 题目地址:https ...
- [Swift]LeetCode963. 最小面积矩形 II | Minimum Area Rectangle II
Given a set of points in the xy-plane, determine the minimum area of any rectangle formed from these ...
- 【Leetcode】Pascal's Triangle II
Given an index k, return the kth row of the Pascal's triangle. For example, given k = 3, Return [1,3 ...
随机推荐
- Halo(三)
接口中可以定义方法 1. 定义静态方法(直接调用) public interface Test { public static void method() { /** * 1.定义一个静态的带有方法体 ...
- mybatis plus generator工具集成(一)
参数配置文档 配置分两步 1.添加依赖 <dependency> <groupId>com.baomidou</groupId> <artifactId> ...
- ZROI week3
作业 poj 1091 跳蚤 容斥原理. 考虑能否跳到旁边就是卡牌的\(gcd\)是否是1,可以根据裴蜀定理证明. 考虑正着做十分的麻烦,所以倒着做,也就是用\(M^N - (不合法)\)即可. 不合 ...
- (转)将SVN从一台服务器迁移到另一台服务器(Windows Server VisualSVN Server)
转:http://blog.sina.com.cn/s/blog_855a24030102xp9q.html 服务器环境: Windows Server 2012 软件版本: VisualSVN-S ...
- 14. Django MTV及Django模型
MTV 我们或许都听说过MVC模式.MVC是模型(model)-视图(view)-控制器(controller)的缩写,一种软件设计典范,用一种业务逻辑.数据.界面显示分离的方法组织代码.Django ...
- 使用soapui进行webservice接口测试
一.web service(SOAP)与HTTP接口的区别 1.什么是web service WebService就是Web服务的意思,对应的应用层协议为SOAP(相当于HTTP协议),可理解为远 ...
- vue-cesium中经纬度写反了,报错
vue-cesium中经纬度写反了,报错 [Vue warn]: Invalid prop: custom validator check failed for prop "position ...
- Cocos2d-x之项目结构分析
| 版权声明:本文为博主原创文章,未经博主允许不得转载. 1.下面是我们创建cocos2d的工程MyGame01里的文件资源 2. 在下面:文件解决方案下面有6个项目,我们的启动优先项为MyGam ...
- JDK,JRE,JVM
jdk JDK是整个Java的核心,包括了Java运行环境(Java Runtime Environment),一堆Java工具和Java基础的类库(rt.jar).不论什么Java应用服务器,实质都 ...
- Linux折腾
安装了一圈发行版,最后发现还是Fedora最稳定 debian安装后无法启动 openSUSE源不完善 manjaro重启就进不去



