写了一个多小时的题目,感觉自己就是个憨憨 🐶
第一个想法
两个矩阵围住了多个点,保存两个矩阵的点集,然后判断点集是否相交
如果相交并且相交点大于矩阵的一边的点数,那么两个矩阵就相交了
如果两个点集不相交,则两个矩阵肯定不相交
class Solution:
def isRectangleOverlap(self, rec1: List[int], rec2: List[int]) -> bool:
# 给定了两个矩形,可以算出两个矩形围住的点,包括边上的
# 两个点集合取交集,如果交集的数量大于较小矩形的一边,则有重叠
# 如果两个矩形围住的点集相交了,那么就是重合了
size=min(rec1[2]-rec1[0],rec2[2]-rec2[0])+1
set1=set()
for x in range(rec1[0],rec1[2]+1):
for y in range(rec1[1],rec1[3]+1):
set1.add((x,y))
set2=set()
for x in range(rec2[0],rec2[2]+1):
for y in range(rec2[1],rec2[3]+1):
set2.add((x,y))
# print(set1,set2)
# if not set1 and not set2:
# pass
# print(set1,set2,set1&set2)
## 如果set1&set2为空,则返回True
return True if len(set1&set2)>size else False
超时了,果然还是太暴力了
第二个奇怪的想法:
计算出两个矩阵相距最远的两个点,这两个点能构成一个大的矩形,并且包含了两个小矩形
- 如果大矩形的面积小于两个小矩形面积之和,则它们相交了
2. 如果大矩形的面积减去两个小矩形的面积,从几何上来看一定会剩下两块…写到一半发现自己想错了
写到这里已经一个多小时了,面试的话就凉凉了
粗略的看了一下题解,看到别人用反例的方法,判断两个矩阵相交的话太麻烦,判断两个矩阵不相交的情况就容易很多
于是自己在图上画了一下,固定一个矩形,那么一共有四种情况两个矩形肯定不会相交
- 矩形1的右上角的x坐标小于等于矩形2的左下角的x坐标
- 矩形1的右上角的y坐标小于等于矩形2的左下角的y坐标
- 矩形1的左下角的x坐标小于等于矩形2的右上角的x坐标
- 矩形1的左下角的y坐标小于等于矩形2的右上角的y坐标
class Solution:
def isRectangleOverlap(self, rec1: List[int], rec2: List[int]) -> bool:
if rec1[2]<=rec2[0] or rec1[3]<=rec2[1] or rec1[0]>=rec2[2] or rec1[1]>=rec2[3]:
return False
return True
代码就简单很多了。。不过效率不是很高
写到这里好像突然想起来之前图形学有学过两个图形是否相交的判断。。不过想不起来了
题解部分
重叠区间
https://leetcode-cn.com/problems/rectangle-overlap/solution/ping-mian-ji-he-ke-xing-yu-de-jiao-ji-jian-dan-yi-/
这个想法就很赞。。。
图片来源是原作者,也就是上面的链接
首先第一个矩形的x属于x1,x2,y属于y1,y2
第二个矩形的x属于x3,x4,y属于y3,y4
不管有没有重叠,重叠的矩形都应该满足这个:
max(x1,x3)<x<min(x2,x4)
max(y1,y3)<y<min(y2,y4)
得到这个性质之后,只需要判断重叠矩形的左边界是否严格小于右边界即可
投影法
https://leetcode-cn.com/problems/rectangle-overlap/solution/tu-jie-jiang-ju-xing-zhong-die-wen-ti-zhuan-hua-we/
这个也很精彩
官方题解
https://leetcode-cn.com/problems/rectangle-overlap/solution/ju-xing-zhong-die-by-leetcode-solution/