从另一个网站看问题。
如果我们从另一面看问题(算法),这个案例其实很简单。
这意味着我们不会回答问题:“矩形是否重叠?”,而是回答问题:“矩形是否不重叠?”。
最后,两个问题都解决了同一个问题,但第二个问题的答案更容易实现,因为矩形不会仅在一个位于另一个下方或一个位于另一个时重叠更靠左(其中一种情况发生就足够了,但当然也可能发生两种情况同时发生 - 这里对逻辑条件“或”的良好理解很重要) .这减少了许多需要在第一个问题上考虑的情况。
整个问题也通过使用适当的变量名来简化:
const areRectanglesOverlap = (rect1, rect2) => {
let [left1, top1, right1, bottom1] = [rect1[0], rect1[1], rect1[2], rect1[3]],
[left2, top2, right2, bottom2] = [rect2[0], rect2[1], rect2[2], rect2[3]];
// The first rectangle is under the second or vice versa
if (top1 < bottom2 || top2 < bottom1) {
return false;
}
// The first rectangle is to the left of the second or vice versa
if (right1 < left2 || right2 < left1) {
return false;
}
// Rectangles overlap
return true;
}
即使如果我们有一个不同的矩形表示,也很容易通过仅修改定义变量更改的部分来使上述函数适应它。函数的进一步部分保持不变不变(当然这里cmets并不是真的需要,但是我添加了它们是为了让大家快速理解这个简单的算法)。
上述函数的等效,但可读性可能稍差形式可能如下所示:
const areRectanglesOverlap = (rect1, rect2) => {
let [left1, top1, right1, bottom1] = [...rect1],
[left2, top2, right2, bottom2] = [...rect2];
return !(top1 < bottom2 || top2 < bottom1 || right1 < left2 || right2 < left1);
}