836. Rectangle Overlap

836. 矩形重叠

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

解法一

//时间复杂度O(1), 空间复杂度O(1)
class Solution {
public:
    bool isRectangleOverlap(vector<int>& rec1, vector<int>& rec2) {
        return rec1[0] < rec2[2] && rec2[0] < rec1[2] &&
               rec1[1] < rec2[3] && rec2[1] < rec1[3];
    }
};

用了一个潜在的规律,第一次见到还是很难想到。

最初想的是找出所有相交的情况,然后找出所有相交情况的共同点做为判据,但是相交的情况分类太多了,不好找规律。所以我们要换个思路,如下。

两个矩形不相交有两种情况:要么两矩形是“上-下”的位置关系,要么是“左-右”的位置关系(两种可以同时满足)。

上-下:(按谁在上分,有两种情况,这里只画一种):
 _ _ __________ (x2,y2)_ _ _ _ _ _ _ _ _
    |          |
 _ _|__________| _ _ _ _ _ _ _ _ _ _ _ _
(x1,y1)    __________ (x4,y4)
          |          |
          |__________|
       (x3,y3) 
           
左-右:(按谁在左分,也两种情况,这里只画一种)
    |__________|(x2,y2)
    |          |        ___________ (x4,y4)
    |__________|       |           |
(x1,y1)        |       |___________|
    |          |     (x3,y3) 

上面的情况都满足关系

           y1 >= y4 或 y2 <= y3  (上-下)
        或 x2 <= x3 或 x4 <= x1  (左-右)

那除了以上的情况,就都是相交了,如下:

           y1 < y4 且 y2 > y3  (上-下)
        且 x2 > x3 且 x4 > x1  (左-右)

直接返回以上结果。

思考这个题时很容易犯一个常见的逻辑错误,就是没搞清楚判据是否是充分必要的。例如,满足一个条件可以判定两矩形相交,但是不满足这个条件,不一定能说明这两个矩形不相交。所以在找规律的时候一定要包括所有情况,不多不少。

2019/07/11 10:28
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值