LeetCode---963. Minimum Area Rectangle II

LeetCode—963. Minimum Area Rectangle II

一堆二维坐标点,找出其中能形成矩形的四个点,使得形成的矩形面积最小。

https://leetcode.com/problems/minimum-area-rectangle-ii/

1.如何找到四个点形成矩形。方法是利用矩形的性质:对角线长度相等,对角坐标的中点重合
2.如何储存找到的四个点,数据结构的问题。将时间复杂度降低到恩芳。python里是字典,java是hash表。键值存储对角线中点的坐标以及长度,value值存储矩形的顶点。

首先遍历,存储每两个点之间形成的线段的长度和中点坐标,存入到设计好的数据结构里,这是两层的循环,恩芳的复杂度。然后在从存储的结构里找到两个坐标对的情况,就是同样的key值有多个value的情况,这些点事能形成的矩形的。在计算面积。

class Solution(object):
    def minAreaFreeRect(self, points):
        """
        :type points: List[List[int]]  [[1,2],[2,1],[1,0],[0,1]]
        :rtype: float
        """
        N = len(points)
        # 字典格式: {(l^2, x#, y#) : [(0,1), (1,2)]} 里面的元素是tuple.数字的意思是第几个坐标点。
        d = collections.defaultdict(list) # 默认字典,可以处理key为空的情况
        for i in range(N - 1):
            pi = points[i]
            for j in range(i + 1, N):
                pj = points[j]
                l = (pi[0] - pj[0]) ** 2 + (pi[1] - pj[1]) ** 2  # 距离的平方
                x = (pi[0] + pj[0]) / 2.0  # 中点横坐标
                y = (pi[1] + pj[1]) / 2.0
                d[(l, x, y)].append((i, j))
        res = float("inf")
        
        for l in d.values():  
            # print(d.values()) = dict_values([[(0, 1)], [(0, 2), (1, 3)], [(0, 3)], [(1, 2)], [(2, 3)]])
            # print(d.keys()) = dict_keys([(2, 1.5, 1.5), (4, 1.0, 1.0), (2, 0.5, 1.5), (2, 1.5, 0.5), (2, 0.5, 0.5)])
            M = len(l)
            for i in range(M - 1): # 因为有相同中点和联连线长度的两点不止一组
                p0, p2 = points[l[i][0]], points[l[i][1]]
                for j in range(i + 1, M):
                    p1, p3 = points[l[j][0]], points[l[j][1]]
                    d1 = math.sqrt((p0[0] - p1[0]) ** 2 + (p0[1] - p1[1]) ** 2)
                    d2 = math.sqrt((p1[0] - p2[0]) ** 2 + (p1[1] - p2[1]) ** 2)
                    area = d1 * d2
                    res = min(res, area)
        return 0 if res == float('inf') else res

猜你喜欢

转载自blog.csdn.net/pnnngchg/article/details/88351919