LeetCode算法个人解答——939.最小面积矩形

题目

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

解(执行时间2180ms)

解题思路

  1. 由于题目是刚出来的,所以查不到其他的解
  2. 矩形需要取四个点
  3. 由于矩形的边平行于 x 轴和 y 轴,所以矩形的三个相邻点是互相联系的
  4. 取对角,[x1, y1] 和 [x2, y2],这样另外两个点就是 [x1, y2] 和 [x2, y1]
  5. 可以自己画一个坐标系,这样可以方便找出规律
class Solution:
    def minAreaRect(self, points):
        """
        :type points: List[List[int]]
        :rtype: int
        """
        # 将坐标转换成元组,并存入字典中
        dic = set([tuple(x) for x in points])
        # 获得点的个数
        n = len(points)
        # 限制最大值
        res = 40001 * 40000
        # 循环取点
        for i in range(n):
            # 保存点的x轴和y轴的坐标
            x1, y1 = points[i]
            # 循环取其他点
            for j in range(i):
                # 保存点的x轴和y轴的坐标
                x2, y2 = points[j]
                # 判读点1的x和点2的y  以及  点1的y和点2的x是否不同
                if x2 != x1 and y2 != y1:
                    # 判断反转后的两个点是否都在集合中
                    if (x2, y1) in dic and (x1, y2) in dic:
                        # 计算矩形的面积,并与 res 比较大小,取最小值
                        res = min(res, abs(y2 - y1) * abs(x2 - x1))
        if res != 40001 * 40000:
            # 如果 res 改变了,则返回结果 res
            return res
        # 如果 res 没改变,则没有矩形
        return 0

你可能感兴趣的:(LeetCode算法)