【LeetCode刷题记录】1、矩形重叠

题目描述:
矩形以列表 [x1, y1, x2, y2] 的形式表示,其中 (x1, y1) 为左下角的坐标,(x2, y2) 是右上角的坐标。
如果相交的面积为正,则称两矩形重叠。需要明确的是,只在角或边接触的两个矩形不构成重叠。
给出两个矩形,判断它们是否重叠并返回结果。

示例 1:
输入:rec1 = [0,0,2,2], rec2 = [1,1,3,3]
输出:true
示例 2:
输入:rec1 = [0,0,1,1], rec2 = [1,0,2,1]
输出:false

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/rectangle-overlap

1、逆向思维,判断不重叠的情况,固定一个矩形,另一个矩形在四周,判断坐标。画个图推一下。
java

class Solution {
    public boolean isRectangleOverlap(int[] rec1, int[] rec2) {
        return !(rec1[2] <= rec2[0] ||   // left
                 rec1[3] <= rec2[1] ||   // bottom
                 rec1[0] >= rec2[2] ||   // right
                 rec1[1] >= rec2[3]);    // top
    }
}

python

class Solution(object):
    def isRectangleOverlap(self, rec1, rec2):
        return not (rec1[2] <= rec2[0] or  # left
                    rec1[3] <= rec2[1] or  # bottom
                    rec1[0] >= rec2[2] or  # right
                    rec1[1] >= rec2[3])    # top

2.重叠情况
将这题中的两个矩形看成是两个可行域,求这两个可行域的交集,也就是最终的可行域即可。
在这里插入图片描述
java

class Solution {
    public boolean isRectangleOverlap(int[] rec1, int[] rec2) {
        return (Math.min(rec1[2], rec2[2]) > Math.max(rec1[0], rec2[0]) &&
                Math.min(rec1[3], rec2[3]) > Math.max(rec1[1], rec2[1]));
    }
}

python

class Solution(object):
    def isRectangleOverlap(self, rec1, rec2):
        ## 插入一个函数,用来判断投影是否有重叠
        def intersect(p_left, p_right, q_left, q_right):
            return min(p_right, q_right) > max(p_left, q_left)
        return (intersect(rec1[0], rec1[2], rec2[0], rec2[2]) and
                intersect(rec1[1], rec1[3], rec2[1], rec2[3]))
class Solution:
    ## 这个函数格式没看懂
    ## 猜测 输入参数  ->输出类型 bool
    def isRectangleOverlap(self, rec1: List[int], rec2: List[int]) -> bool:

        x1 = max(rec1[0], rec2[0])
        y1 = max(rec1[1], rec2[1])

        x2 = min(rec1[2], rec2[2])
        y2 = min(rec1[3], rec2[3])

        if x1 < x2 and y1 < y2:
            return True
        else:
            return False
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值