A rectangle is represented as a list [x1, y1, x2, y2], where (x1, y1) are the coordinates of its bottom-left corner, and (x2, y2) are the coordinates of its top-right corner.
Two rectangles overlap if the area of their intersection is positive. To be clear, two rectangles that only touch at the corner or edges do not overlap.
Given two (axis-aligned) rectangles, return whether they overlap.
Example 1:
Input: rec1 = [0,0,2,2], rec2 = [1,1,3,3] Output: true
Example 2:
Input: rec1 = [0,0,1,1], rec2 = [1,0,2,1] Output: false
Notes:
- Both rectangles
rec1andrec2are lists of 4 integers. - All coordinates in rectangles will be between
-10^9and10^9.
這道題讓我們求兩個矩形是否是重疊,矩形的表示方法是用兩個點,左下和右上點來定位的。下面的講解是參見網友大神jayesch的帖子來的,首先,返璞歸真,在玩 2D 之前,先看下 1D 上是如何運作的。對於兩條線段,它們相交的話可以是如下情況:
x3 x4 |--------------| |--------------| x1 x2
我們可以直觀的看出一些關系:
x1 < x3 < x2 && x3 < x2 < x4
可以稍微化簡一下:
x1 < x4 && x3 < x2
就算是調換個位置:
x1 x2 |--------------| |--------------| x3 x4
還是能得到同樣的關系:
x3 < x2 && x1 < x4
好,下面我們進軍 2D 的世界,實際上 2D 的重疊就是兩個方向都同時滿足 1D 的重疊條件即可。由於題目中說明了兩個矩形的重合面積為正才算 overlap,就是說挨着邊的不算重疊,那么兩個矩形重疊主要有這四種情況:
1)兩個矩形在矩形1的右上角重疊:
____________________x4,y4 | | _______|______x2,y2 | | |______|____________| | x3,y3 | |______________| x1,y1
滿足的條件為:x1 < x4 && x3 < x2 && y1 < y4 && y3 < y2
2)兩個矩形在矩形1的左上角重疊:
___________________ x4,y4 | | | _______|____________x2,y2 |___________|_______| | x3,y3 | | |___________________| x1,y1
滿足的條件為:x3 < x2 && x1 < x4 && y1 < y4 && y3 < y2
3)兩個矩形在矩形1的左下角重疊:
____________________x2,y2 | | _______|______x4,y4 | | |______|____________| | x1,y1 | |______________| x3,y3
滿足的條件為:x3 < x2 && x1 < x4 && y3 < y2 && y1 < y4
4)兩個矩形在矩形1的右下角重疊:
___________________ x2,y2 | | | _______|____________x4,y4 |___________|_______| | x1,y1 | | |___________________| x3,y3
滿足的條件為:x1 < x4 && x3 < x2 && y3 < y2 && y1 < y4
仔細觀察可以發現,上面四種情況的滿足條件其實都是相同的,只不過順序調換了位置,所以我們只要一行就可以解決問題了,碉堡了。。。
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]; } };
Github 同步地址:
https://github.com/grandyang/leetcode/issues/836
類似題目:
參考資料:
https://leetcode.com/problems/rectangle-overlap/
https://leetcode.com/problems/rectangle-overlap/discuss/132319/My-One-Line-C%2B%2B-Solution
