【leetcode】939. Minimum Area Rectangle
2024-08-31 02:59:41
题目如下:
Given a set of points in the xy-plane, determine the minimum area of a rectangle formed from these points, with sides parallel to the x and y axes.
If there isn't any rectangle, return 0.
Example 1:
Input: [[1,1],[1,3],[3,1],[3,3],[2,2]]
Output: 4Example 2:
Input: [[1,1],[1,3],[3,1],[3,3],[4,1],[4,3]]
Output: 2Note:
1 <= points.length <= 500
0 <= points[i][0] <= 40000
0 <= points[i][1] <= 40000
- All points are distinct.
解题思路:题目中约定了矩形的各边要与X轴或者Y轴平行,所以不妨把所有的点按X轴进行分组。例如 [[1,1],[1,3],[3,1],[3,3],[2,2]],以X的坐标分组后得到 {1: [1, 3], 2: [2], 3: [1, 3]},接下来只要判断两个不同的X轴所对应的Y轴的list中是否存在相同的元素,如果相同则表示可以组成一个题目中要求的矩形。最后求出最小面积即可。
代码如下:
class Solution(object):
def minAreaRect(self, points):
"""
:type points: List[List[int]]
:rtype: int
"""
dic_x = {}
res = float('inf')
x_set = set()
for (x,y) in points:
dic_x[x] = dic_x.setdefault(x,[]) + [y]
x_set.add(x)
x_list = sorted(list(x_set)) for kx1 in range(len(x_list)):
for kx2 in range(kx1+1,len(x_list)):
intersection = sorted((list(set(dic_x[x_list[kx1]]) & set(dic_x[x_list[kx2]]))))
if len(intersection) < 2:
continue
minDis = intersection[-1] - intersection[0]
for i in range(len(intersection)-1):
minDis = min(minDis,intersection[i+1] - intersection[i])
#print kx1,kx2,intersection
res = min(res, minDis * abs(x_list[kx1]-x_list[kx2]))
return res if res != float('inf') else 0
最新文章
- [LintCode] Longest Substring Without Repeating Characters
- matlab自带princomp(PCA降维方式)
- HDU - 1693 Eat the Trees(多回路插头DP)
- K - The Unique MST - poj 1679
- C++菱形继承的构造函数
- Mac经常使用快捷键
- 自己定义View之绘制圆环
- POJ Sudoku 数独填数 DFS
- VUE相关资料合集
- 【Android 应用开发】Android 数据存储 之 SQLite数据库详解
- 如何隐藏nginx版本号
- Elasticsearch6.5.2 X-pack破解及安装教程
- Servlet、Listener和Filter
- IntelliJ IDEA 2018破解方法
- Python写出LSTM-RNN的代码
- 常用Java集合类总结
- Hashtable 和 HashMap 以及 ConcurrentHashMap
- JS模块规范
- Excel对同样项求和
- C++中几个值得分析的小问题(1)