【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 ...
随机推荐
- error: Error trying to parse settings: Unexpected trailing characters in Packages\User\Preferences.sublime-settings:9:2 reloading settings Packages/User/Preferences.sublime-settings
error: Error trying to parse settings: Unexpected trailing characters in Packages\User\Preferences.s ...
- oracle trim无效?
这里说说如果是全角空格怎么去除 方法一 trim(TO_SINGLE_BYTE('aaa')) 方法二 SELECT TRIM(replace('aaa',' ','')) FROM dual
- 如何在Mac上将视频刻录到DVD / ISO文件
如果您希望将喜爱的视频转换为DVD / Blu-ray光盘以进行物理备份或播放,则Mac版Wondershare UniConverter可以专业地完成任务.今天的教程就是如何在Mac上轻松刻录DVD ...
- 【架构】Linux的架构(architecture)
最内层是硬件,最外层是用户常用的应用,比如说firefox浏览器,evolution查看邮件,一个计算流体模型等等.硬件是物质基础,而应用提供服务.但在两者之间,还要经过一番周折. 还记得Linux启 ...
- 「NOI2016」区间 解题报告
「NOI2016」区间 最近思维好僵硬啊... 一上来就觉得先把区间拆成两个端点进行差分,然后扫描位置序列,在每个位置维护答案,用数据结构维护当前位置的区间序列,但是不会维护. 于是想研究性质,想到为 ...
- Android中的ImageView的getDrawableCache获取背景图片的时候注意的问题
获取ImageView的背景图片使用getDrawableCache方法,不要使用getDrawable方法,后者获取不到图片的. 1.在调用imageView.getDrawableCache()之 ...
- [CSP-S模拟测试]:E(贪心)
题目传送门(内部题48) 输入格式 第一行一个整数$n$.接下来$n$行每行两个整数$x_i,y_i$. 输出格式 一行一个整数表示答案. 样例 样例输入$1$: 23 72 5 样例输出$1$: 样 ...
- 【已转移】【Java架构:基础技术】一篇文章搞掂:Java 8
本文篇幅较长,建议合理利用右上角目录进行查看(如果没有目录请刷新). 一.Java的历史与演变 目的:为完全了解Java,需要理解Java的诞生原因.成型动力以及他继承的思想. 计算机语言的创新与发展 ...
- 2018-2019-2 20175223 实验三《敏捷开发与XP实践》实验报告
目录 北京电子科技学院(BESTI)实验报告 实验名称:实验三 敏捷开发与XP实践 实验内容.步骤与体会: 一.实验三 敏捷开发与XP实践-1 二.实验三 敏捷开发与XP实践-2 三.实验三 敏捷开发 ...
- eclipse run error:g++ not found in Path
网上有人说: 在eclipse下 windows-->Preference-->C/C++-->Build-->Setting然后选择Discovery标签,将里面的内容全部R ...



