3047. 求交集区域内的最大正方形面积

在二维平面上存在 n 个矩形。给你两个下标从 0 开始的二维整数数组 bottomLeft 和 topRight,两个数组的大小都是 n x 2 ,其中 bottomLeft[i] 和 topRight[i] 分别代表第 i 个矩形的 左下角 和 右上角 坐标。

我们定义 向右 的方向为 x 轴正半轴(x 坐标增加),向左 的方向为 x 轴负半轴(x 坐标减少)。同样地,定义 向上 的方向为 y 轴正半轴(y 坐标增加,向下 的方向为 y 轴负半轴(y 坐标减少)。

你可以选择一个区域,该区域由两个矩形的 交集 形成。你需要找出能够放入该区域 内  最大 正方形面积,并选择最优解。

返回能够放入交集区域的正方形的 最大 可能面积,如果矩形之间不存在任何交集区域,则返回 0

示例 1:

输入:bottomLeft = [[1,1],[2,2],[3,1]], topRight = [[3,3],[4,4],[6,6]]
输出:1
解释:边长为 1 的正方形可以放入矩形 0 和矩形 1 的交集区域,或矩形 1 和矩形 2 的交集区域。因此最大面积是边长 * 边长,即 1 * 1 = 1。
可以证明,边长更大的正方形无法放入任何交集区域。

示例 2:

输入:bottomLeft = [[1,1],[2,2],[1,2]], topRight = [[3,3],[4,4],[3,4]]
输出:1
解释:边长为 1 的正方形可以放入矩形 0 和矩形 1,矩形 1 和矩形 2,或所有三个矩形的交集区域。因此最大面积是边长 * 边长,即 1 * 1 = 1。
可以证明,边长更大的正方形无法放入任何交集区域。
请注意,区域可以由多于两个矩形的交集构成。

示例 3:

输入:bottomLeft = [[1,1],[3,3],[3,1]], topRight = [[2,2],[4,4],[4,2]]
输出:0
解释:不存在相交的矩形,因此,返回 0 。

提示:

当一个矩形的左下角x坐标大于另一个矩形的右上角x坐标时,两个矩形不会重叠。y坐标也是如此。

class Solution:
    def largestSquareArea(self, bottomLeft: List[List[int]], topRight: List[List[int]]) -> int:
        n = len(bottomLeft)
        max_m = 0 #最大面积
        for i in range(n-1):
            for j in range(i+1,n):
                #去掉不可能重叠的情况
                if bottomLeft[i][0] > topRight[j][0] or  bottomLeft[j][0] > topRight[i][0] or bottomLeft[i][1] > topRight[j][1] or  bottomLeft[j][1] > topRight[i][1]:
                    continue
                qual = [0] * 4
                #计算重叠部分的面积,短边乘短边
                for k in range(2):
                    if topRight[i][k] < topRight[j][k]:
                        qual[k] = topRight[i][k]
                    else:
                        qual[k] = topRight[j][k]
                for k in range(2):
                    if bottomLeft[i][k] > bottomLeft[j][k]:
                        qual[2+k] = bottomLeft[i][k]
                    else:
                        qual[2+k] = bottomLeft[j][k]
                a = qual[0] - qual[2]
                b = qual[1] - qual[3]
                if a*a < b*b :
                    if a*a > max_m:
                        max_m = a*a
                else:
                    if b*b > max_m:
                        max_m = b*b
        return max_m






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值