地址:https://leetcode-cn.com/problems/rectangle-overlap/

题目

矩形以列表 [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

提示:

  1. 两个矩形 rec1rec2 都以含有四个整数的列表的形式给出。
  2. 矩形中的所有坐标都处于 -10^910^9 之间。
  3. x 轴默认指向右,y 轴默认指向上。
  4. 你可以仅考虑矩形是正放的情况。

解题思路

这个题我觉得主要是考思维吧,因为这个题完全没用到循环什么的,就一个两个判断就可以了,以至于我一开始都不太相信就是这么做的……

根据题目的意思,两个矩形的坐标一定是左下角坐标在前,右上角坐标在后,也就是可以确定 rec1[0] 不可能比 rec1[2] 大,其它的坐标也是同理。

首先对传入的 rec1rec2 做检查,矩形坐标不合法就直接返回 false

如果矩形坐标合法,那么要使两个矩形重叠,只需要满足 rec1 右上角的点在 rec2 左下角的点的右上方,rec1 左下角的点在 rec2 右上角的点的左下方。

代码

class Solution {
public:
    bool isRectangleOverlap(vector<int>& rec1, vector<int>& rec2) {
        if (rec1.empty() || rec2.empty() ||
            rec1[0] == rec1[2] || rec1[1] == rec1[3] ||
            rec2[0] == rec2[2] || rec2[1] == rec2[3])
            return false;
        //只要rec1右上角的点在rec2左下角的点的右上方,
        //rec1左下角的点在rec2右上角的点的左下方,就一定重叠
        if (rec1[2] > rec2[0] && rec1[3] > rec2[1] &&
            rec1[0] < rec2[2] && rec1[1] < rec2[3])
            return true;
        return false;//默认返回false
    }
};


Leetcode      Leetcode C++

本博客所有文章除特别声明外,均采用 CC BY-SA 3.0协议 。转载请注明出处!