package LeetCode.FiveHundredOneToOneThousand;
public class EightHundredAndThirtySix {
public boolean isRectangleOverlap(int[] rec1, int[] rec2) {
//开始小于结束/结束大于开始
boolean x = !(rec1[0] <= rec2[1] || rec1[1] >= rec2[0]);
boolean y = !(rec1[2] <= rec2[3] || rec1[3] >= rec2[2]);
return x&&y;
}
}
又是借鉴nettee大佬的解法。
矩形重叠要考虑的情况很多,两个矩形的重叠可能有好多种不同的形态。这道题如果用蛮力做的话,很容易遗漏掉某些情况,导致出错。
矩形重叠是二维的问题,所以情况很多,比较复杂。为了简化问题,我们可以考虑将二维问题转化为一维问题。既然题目中的矩形都是平行于坐标轴的,我们将矩形投影到坐标轴上:
矩形投影到坐标轴上,就变成了区间。稍加思考,我们发现:两个互相重叠的矩形,它们在 xx 轴和 yy 轴上投影出的区间也是互相重叠的。这样,我们就将矩形重叠问题转化成了区间重叠问题。
区间重叠是一维的问题,比二维问题简单很多。我们可以穷举出两个区间所有可能的 6 种关系:
可以看到,区间的 6 种关系中,不重叠只有两种情况,判断不重叠更简单。假设两个区间分别是 [s1, e1] 和 [s2, e2] 的话,区间不重叠的两种情况就是 e1 <= s2 和 e2 <= s1。
我们就得到区间不重叠的条件:e1 <= s2 || e2 <= s1。将条件取反即为区间重叠的条件。
这样,我们就可以写出判断矩形重叠的代码了。