题目
难度:★★★★☆
类型:数学
方法:分类讨论
传送门
在二维平面上计算出两个由直线构成的矩形重叠后形成的总面积。
每个矩形由其左下顶点和右上顶点坐标表示。
示例:
输入: -3, 0, 3, 4, 0, -1, 9, 2
输出: 45
解答
在CV岗面试中经常遇到的面试题,检测中的iou计算都需要。
合并后的面积等于两个矩形各自面积和减去公共面积。这里需要知道公共矩形区域的坐标,需要分类讨论,实际上可以分成两种情况,计算两个矩形左端中最大的作为公共矩形的左端,右端中最小的作为公共矩形的右端,上端中最小的作为公共矩形的上端,下段中最大的作为公共矩形的下端。获得各个边界线后,需要判断能否构成矩形,需要下端小于上端,左端小于右端,如果不能那么公共区域面积就是零。
class Solution:
def computeArea(self, A: int, B: int, C: int, D: int, E: int, F: int, G: int, H: int) -> int:
rect1_left, rect1_right, rect1_top, rect1_down = A, C, D, B
rect2_left, rect2_right, rect2_top, rect2_down = E, G, H, F
inter_left = max(rect1_left, rect2_left)
inter_right = min(rect1_right, rect2_right)
inter_top = min(rect1_top, rect2_top)
inter_down = max(rect1_down, rect2_down)
def get_area(left, right, top, down):
return (right - left) * (top - down) if right > left and top > down else 0
area1 = get_area(rect1_left, rect1_right, rect1_top, rect1_down)
area2 = get_area(rect2_left, rect2_right, rect2_top, rect2_down)
area_inter = get_area(inter_left, inter_right, inter_top, inter_down)
return area1 + area2 - area_inter
如有疑问或建议,欢迎评论区留言~