题目描述:
矩形以列表 [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
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/rectangle-overlap
1、逆向思维,判断不重叠的情况,固定一个矩形,另一个矩形在四周,判断坐标。画个图推一下。
java
class Solution {
public boolean isRectangleOverlap(int[] rec1, int[] rec2) {
return !(rec1[2] <= rec2[0] || // left
rec1[3] <= rec2[1] || // bottom
rec1[0] >= rec2[2] || // right
rec1[1] >= rec2[3]); // top
}
}
python
class Solution(object):
def isRectangleOverlap(self, rec1, rec2):
return not (rec1[2] <= rec2[0] or # left
rec1[3] <= rec2[1] or # bottom
rec1[0] >= rec2[2] or # right
rec1[1] >= rec2[3]) # top
2.重叠情况
将这题中的两个矩形看成是两个可行域,求这两个可行域的交集,也就是最终的可行域即可。
java
class Solution {
public boolean isRectangleOverlap(int[] rec1, int[] rec2) {
return (Math.min(rec1[2], rec2[2]) > Math.max(rec1[0], rec2[0]) &&
Math.min(rec1[3], rec2[3]) > Math.max(rec1[1], rec2[1]));
}
}
python
class Solution(object):
def isRectangleOverlap(self, rec1, rec2):
## 插入一个函数,用来判断投影是否有重叠
def intersect(p_left, p_right, q_left, q_right):
return min(p_right, q_right) > max(p_left, q_left)
return (intersect(rec1[0], rec1[2], rec2[0], rec2[2]) and
intersect(rec1[1], rec1[3], rec2[1], rec2[3]))
class Solution:
## 这个函数格式没看懂
## 猜测 输入参数 ->输出类型 bool
def isRectangleOverlap(self, rec1: List[int], rec2: List[int]) -> bool:
x1 = max(rec1[0], rec2[0])
y1 = max(rec1[1], rec2[1])
x2 = min(rec1[2], rec2[2])
y2 = min(rec1[3], rec2[3])
if x1 < x2 and y1 < y2:
return True
else:
return False