zoukankan      html  css  js  c++  java
  • LeetCode矩形重叠

    题目描述:

    矩形以列表 [x1, y1, x2, y2] 的形式表示,其中 (x1, y1) 为左下角的坐标,(x2, y2) 是右上角的坐标。

    如果相交的面积为正,则称两矩形重叠。需要明确的是,只在角或边接触的两个矩形不构成重叠。

    给出两个矩形,判断它们是否重叠并返回结果。

    示例:

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

    解题思路:

    第一种(考虑边界值):

    思路:我们可以在平面建一个坐标系,画出 rec2 的矩形,坐标分别为(rec2[0], rec2[1], rec2[2], rec2[3]),现在我们考虑不重叠情况。当 rec1 和 rec2 不发生重叠时,rec1 可以在 rec2 的 上、下、左、右。这里以左边为例(其他别思路相同):当 rec1 在 rec2 的左边时,rec1 右上角的 x 坐标(即:rec1[2])应该小于等于 rec2 的左下角的 x 坐标(即:rec2[0]), 表达式为:rec1[2] <= rec2[0]。其他方向思路相同。

    rec1[2] <= rec2[0]   # 左侧
    rec1[0] >= rec2[2]   # 右侧
    rec1[1] >= rec2[3]   # 上侧
    rec1[3] <= rec2[1]   # 下侧

    代码:

    from typing import List

    def isRectangleOverlap(rec1: List[int], rec2: List[int]) -> bool:
    return not (
    rec1[2] <= rec2[0] or
    rec1[0] >= rec2[2] or
    rec1[1] >= rec2[3] or
    rec1[3] <= rec2[1]
    )
    
    
    print(isRectangleOverlap(rec1 = [0,0,2,2], rec2 = [1,1,3,3]))  # True

    第二种(考虑重叠):

    思路:画上一个平面坐标系,将 rec1 和 rec2 的矩形的部分面积相重叠,将两个矩形的 “左下角” “右上角” 的坐标投射到 x、y轴上,可以看到在 x 、y轴上,两者会有交集。由数学知识可得,当 min(rec1[2], rec2[2]) > max(rec1[0], rec2[0]) 时,在x轴上有交集,当 min(rec1[3], rec2[3]) > max(rec1[1], rec2[1]) 时,在y轴上右交集。

    代码:

    from typing import List
    
    def isRectangleOverlap(rec1: List[int], rec2: List[int]) -> bool:
        return (min(rec1[2], rec2[2]) > max(rec1[0], rec2[0])
                and min(rec1[3], rec2[3]) > max(rec1[1], rec2[1]))

    print(isRectangleOverlap(rec1 = [0,0,2,2], rec2 = [1,1,3,3]))  # True
  • 相关阅读:
    Zotero群组新建后无法显示
    配置vscode的C++环境Unexpected GDB output from command "-environment-cd
    战地5
    virtual studio发布到gihub
    virtual stuido同时调试多个控制台
    js复制标题和链接
    语义理解偶然算法带来的感动
    漂亮的打火机
    雷柏鼠标vt350Q配对
    Unable to open 'free_base.cpp': Unable to read file 'c:Program FilesMicrosoft VS Codeminkernelcrtsucrtsrcappcrtheapfree_base.cpp'
  • 原文地址:https://www.cnblogs.com/RiverMap/p/12520368.html
Copyright © 2011-2022 走看看