给定在 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. 1 <= points.length <= 500
  2. 0 <= points[i][0] <= 40000
  3. 0 <= points[i][1] <= 40000
  4. 所有的点都是不同的。

解题思路

首先做一些准备工作。我们知道如果所有的点在同一行或者同一列上,那么我们就没有解。

n = len(points)
nx = len(set(x for x, y in points))
ny = len(set(y for x, y in points))
if nx == n or ny == n:return 0

我们首先想到的解法就是暴力破解,首先遍历points,从中选出第一个访问点[x1,y1],将所有访问过的[x1,y1]添加到一个set中,,我们每次从set中选出第二个点[x2,y2](也就是先确定对角线上的点),然后判断[x1,y2][x2,y1]是不是在set中,这样我们就可以判断出是否存在由[x1,y1]->[x2,y2]形成的矩形。最后取所有面积的最小值即可。

class Solution:def minAreaRect(self, points):""":type points: List[List[int]]:rtype: int"""mem = set()result = float("inf")for x1, y1 in points:for x2, y2 in mem:if (x1, y2) in mem and (x2, y1) in mem:area = abs(x1 - x2)*abs(y1 - y2)if area and area < result:result = areamem.add((x1, y1))return result if result != float("inf") else 0

另外我们也可以想到这样的思路,就是找平行于x轴和平行于y轴的平行线,然后在这些平行线中找间隔最小的平行于xy轴的平行线,将这两个间隔相乘即为最小面积。

首先我们先要遍历全部的point,然后将所有相同的x轴的点加入到一个list中,由于横坐标的数量不定,所以我们选用defaultdict去存放所有的list

1:1, 3
3:3, 1
2:2

注意,因为python没有自带ordered_setordered_map这两种结构,所有我们要对上述的dict和所有的list先排序,然后再从左到右从下到上遍历所有的直线。我们首先采取的策略是,先从所有的横坐标中选取出两个,然后取这两个横坐标对应的纵坐标的交集,然后从交集中选取两个元素,最后就是取横坐标差乘以纵坐标差的最小值。

from collections import defaultdict
class Solution:def minAreaRect(self, points):""":type points: List[List[int]]:rtype: int"""columns = defaultdict(set)for x, y in points:columns[x].add(y)result = float('inf')columns_keys_list = list(columns.keys())for i, x1 in enumerate(columns_keys_list):for x2 in columns_keys_list[i+1:]:y = sorted(list(columns[x1] & columns[x2]))for i in range(1,len(y)):result = min(result, abs(x1 - x2)*abs(y[i] - y[i-1]))return result if result != float('inf') else 0

另外一种思路是遍历所有的横坐标,例如当我们遍历到x时,我们再遍历想x对应的所有纵坐标,从纵坐标中选出y1,y2看我们之前访问过的横坐标中是否有相同的纵坐标,如果有的话,那么我们就可以构成矩形,我们计算此时矩形的面积,接着我们将y1,y2添加到访问记录中。

这样做法的好处在于,我们的访问记录可以使用set这种结构,这样我们在查找的时候就会非常迅速。

from collections import defaultdict
class Solution:def minAreaRect(self, points):""":type points: List[List[int]]:rtype: int"""columns = defaultdict(list)for x, y in points:columns[x].append(y)seen, result = {}, float('inf')for x2 in sorted(columns):column = columns[x2]column.sort()for j, y2 in enumerate(column):for i in range(j):y1 = column[i]if (y1, y2) in seen:result = min(result, (x2 - seen[y1,y2]) * (y2 - y1))seen[y1, y2] = x2return result if result != float('inf') else 0

不过这个代码使用c++实现相当不容易。

reference:

https://leetcode.com/problems/minimum-area-rectangle/discuss/192021/Python-O(N1.5)-80ms

https://leetcode.com/problems/minimum-area-rectangle/discuss/192026/C++-hash-map-+-set-intersection-56-ms

我将该问题的其他语言版本添加到了我的GitHub Leetcode

如有问题,希望大家指出!!!

Leetcode 939:最小面积矩形(最详细的解法!!!)相关推荐

  1. LeetCode 939. 最小面积矩形(哈希)

    文章目录 1. 题目 2. 解题 1. 题目 给定在 xy 平面上的一组点,确定由这些点组成的矩形的最小面积,其中矩形的边平行于 x 轴和 y 轴. 如果没有任何矩形,就返回 0. 示例 1: 输入: ...

  2. leetcode最小面积_LeetCode—— 939. 最小面积矩形(JavaScript)

    给定在 xy 平面上的一组点,确定由这些点组成的矩形的最小面积,其中矩形的边平行于 x 轴和 y 轴. 如果没有任何矩形,就返回 0. 示例 1: 输入:[[1,1],[1,3],[3,1],[3,3 ...

  3. LeetCode 963. 最小面积矩形 II

    文章目录 1. 题目 2. 解题 1. 题目 给定在 xy 平面上的一组点,确定由这些点组成的任何矩形的最小面积,其中矩形的边不一定平行于 x 轴和 y 轴. 如果没有任何矩形,就返回 0. 示例 1 ...

  4. [Leetcode 963] 最小面积矩形 II

    题意: 平面坐标系中一些点,找四个拼成面积在最小的矩形. 思路: 长方形判定定理:对角线相等,且互相平分的四边形是矩形. 首先平方枚举两个点所构成的所有线段. 对于这些线段把它们当做长方形的一条对角线 ...

  5. 939. 最小面积矩形

    给定在 xy 平面上的一组点,确定由这些点组成的矩形的最小面积,其中矩形的边平行于 x 轴和 y 轴. 如果没有任何矩形,就返回 0. 示例 1: 输入:[[1,1],[1,3],[3,1],[3,3 ...

  6. Leetcode 963. 最小面积矩形 II 解题思路及C++实现

    解题思路: 这道题目的难点在于如何判断一个矩形,网上也有很多方法. 对于给定的四个点,可以判断其四个顶点是否是直角,或者先求出中心点,矩形中每个点到中心点的距离是相等的. 下面给出的程序的逻辑是:暴力 ...

  7. leetcode最小面积_Code Review Swift 算法题: 最小面积矩形  Leetcode 的动人之处

    题目描述: 939. 最小面积矩形 给定在 xy 平面上的一组点,确定由这些点组成的矩形的最小面积,其中矩形的边平行于 x 轴和 y 轴. 如果没有任何矩形,就返回 0. 示例 1: 输入:[[1,1 ...

  8. leetcode 64. 最小路径和(递归 / 动态规划解法图解)(Java版)

    题目 leetcode 64. 最小路径和 提示: m == grid.length n == grid[i].length 1 <= m, n <= 200 0 <= grid[i ...

  9. Leetcode 1162:地图分析(超详细的解法!!!)

    你现在手里有一份大小为 N x N 的『地图』(网格) grid,上面的每个『区域』(单元格)都用 0 和 1 标记好了.其中 0 代表海洋,1 代表陆地,你知道距离陆地区域最远的海洋区域是是哪一个吗 ...

最新文章

  1. 田志刚:写文章的两个好处
  2. PMCAFF高端俱乐部首次集结,最顶级产品人的私密俱乐部!
  3. android解压zap空间耗费,安卓zap抹机模块
  4. 快速搜索Wox工具之Everything Service没有运行报错,解决办法!
  5. 机器学习笔记笔记之三——文本类型处理-词袋法、TF-IDF理解
  6. 小白如何快速绘制原型图
  7. 【贪玩巴斯】传感器与检测技术 (二)「半导体传感器基础」2021-09-30
  8. 微信登录app提示服务器异常,微信登录异常怎么办?微信登录异常的原因以及解决方法...
  9. 蜀门linux一键端,【蜀门】网游单机版 蜀门镜像一键端 送全套GM口令工具刷金币钻石...
  10. KNEEL: Knee Anatomical Landmark Localization Using Hourglass Networks
  11. 炫龙炎魔T1笔记本 Win7 系统安装
  12. boost::python::detail::destroy_referent相关的测试程序
  13. NASA关于编程的十条原则
  14. Python每日一练(13)-IQ智商判断及测试
  15. ArcGIS Enterprise部署介绍
  16. 2019AMC美国数学竞赛历年晋级分数线cutoff/DHR公布
  17. 计算机科学与技术专业考数媒,数字媒体技术专业考研院校排名
  18. 夏日葵电商:为你揭秘微信商城系统搭建的六大详细步骤
  19. 快速提高网站流量的外部链接发布与推广技巧
  20. 驱动lvds双8位时钟_烧写液晶屏驱动软件识别

热门文章

  1. 平均任期2年,苹果、谷歌、微软等公司的程序员为何偏爱跳槽!
  2. 用飞书,随时随地轻松实现微办公
  3. 《网络安全审查办法》
  4. rog 幻 16 经典版 2023 评测 怎么样
  5. Linux设备树学习2 - DTB文件格式
  6. Request cannot be executed; I/O reactor status: STOPPED 另外的解决方法
  7. Ubuntu换Kali源
  8. Conv3d 3D卷积
  9. 孩子的世界20060303
  10. 那根胡萝卜---走出软件作坊:三五个人十来条枪 如何成为开发正规军(十五)