给你一个数组 rectangles ,其中 rectangles[i] = [xi, yi, ai, bi] 表示一个坐标轴平行的矩形。这个矩形的左下顶点是 (xi, yi) ,右上顶点是 (ai, bi) 。
如果所有矩形一起精确覆盖了某个矩形区域,则返回 true ;否则,返回 false 。
def isRectangleCover(self, rectangles: List[List[int]]) -> bool:
# 正方形四个点的初始化
minX, minY, maxA, maxB = rectangles[0][0], rectangles[0][1], rectangles[0][2], rectangles[0][3]
# 面积
area = 0
cnt = defaultdict(int)
for rectangle in rectangles:
x, y, a, b = rectangle[0], rectangle[1], rectangle[2], rectangle[3]
area += (a - x) * (b - y)
# 注意四个点是哪两个属性值决定的
minX = min(minX, x)
minY = min(minY, y)
maxA = max(maxA, a)
maxB = max(maxB, b)
# 除了完美正方形的四个顶点,其余点只能出现2、4次
cnt[(x, y)] += 1
cnt[(a, y)] += 1
cnt[(x, b)] += 1
cnt[(a, b)] += 1
# 大面积等于小面积之和 且 四个顶点各出现一次
if area != (maxA - minX) * (maxB - minY) or cnt[(minX, minY)] != 1 or cnt[(maxA, minY)] != 1 \
or cnt[(minX, maxB)] != 1 or cnt[(maxA, maxB)] != 1:
return False
del cnt[(minX, minY)]
del cnt[(maxA, minY)]
del cnt[(minX, maxB)]
del cnt[(maxA, maxB)]
return all(c == 2 or c == 4 for c in cnt.values())
时间复杂度:O(n)
空间复杂度:O(n)
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/perfect-rectangle
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。