问题描述:
给你一个数组 rectangles ,其中 rectangles[i] = [xi, yi, ai, bi] 表示一个坐标轴平行的矩形。这个矩形的左下顶点是 (xi, yi) ,右上顶点是 (ai, bi) 。
如果所有矩形一起精确覆盖了某个矩形区域,则返回 true ;否则,返回 false 。
问题分析:
如果是完美矩形 那么一定满足两点: (1)最左下 最左上 最右下 最右上 的四个点只出现一次 其他点成对出现 (2)四个点围城的矩形面积 = 小矩形的面积之和
问题求解:
class Solution:
def isRectangleCover(self, rectangles: List[List[int]]) -> bool:
area = 0
res1=defaultdict(int)
for i in rectangles:
area = area + (i[2]-i[0])*(i[3]-i[1])
res1[(i[0],i[1])]+=1
res1[(i[0],i[3])]+=1
res1[(i[2],i[3])]+=1
res1[(i[2],i[1])]+=1
res=[]
for i in res1:
if res1[i]%2==1:
res.append(i)
if len(res)!=4:return False
res.sort()
if res[0][0] == res[1][0] and res[2][0]==res[3][0] and res[0][1] == res[2][1] and res[1][1] == res[3][1] and area == (res[3][1]-res[0][1])*(res[2][0]-res[0][0]):
return True
return False
问题总结:
老规矩先看一下官方求解思路。
方法一:哈希表
精确覆盖意味着:
矩形区域中不能有空缺,即矩形区域的面积等于所有矩形的面积之和;
矩形区域中不能有相交区域。
我们需要一个统计量来判定是否存在相交区域。由于精确覆盖意味着矩形的边和顶点会重合在一起,我们不妨统计每个矩形顶点的出现次数。同一个位置至多只能存在四个顶点,在满足该条件的前提下,如果矩形区域中有相交区域,这要么导致矩形区域四角的顶点出现不止一次,要么导致非四角的顶点存在出现一次或三次的顶点;
因此要满足精确覆盖,除了要满足矩形区域的面积等于所有矩形的面积之和,还要满足矩形区域四角的顶点只能出现一次,且其余顶点的出现次数只能是两次或四次。
在代码实现时,我们可以遍历矩形数组,计算矩形区域四个顶点的位置,以及矩形面积之和,并用哈希表统计每个矩形的顶点的出现次数。遍历完成后,检查矩形区域的面积是否等于所有矩形的面积之和,以及每个顶点的出现次数是否满足上述要求。
Python3JavaC#GolangC++JavaScript
作者:LeetCode-Solution
链接:https://leetcode-cn.com/problems/perfect-rectangle/solution/wan-mei-ju-xing-by-leetcode-solution-ty8q/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。