原题链接:Rectangle Area
数学不是很溜的我在这道题上沉思良久,最终,,,,,,,,我打开了Google =_=.
以下是借鉴了别人以后,我改进的解法:
class Solution:
# @param {integer} A
# @param {integer} B
# @param {integer} C
# @param {integer} D
# @param {integer} E
# @param {integer} F
# @param {integer} G
# @param {integer} H
# @return {integer}
def computeArea(self, A, B, C, D, E, F, G, H):
areaSum = (C - A) * (D - B) + (G - E) * (H - F)
if C <= E or G <= A:
return areaSum
if F >= D or B >= H:
return areaSum
right = min(C, G)
left = max(A, E)
top = min(H, D)
bottom = max(F, B)
commonArea = (right - left) * (top - bottom)
return areaSum - commonArea
讲解如下:
这道题是求总面积,
1.如果不相交的情况下就是两个矩形面积之和,即areaSum
。
2.如果相交的话,就是两个矩形面积之和减去相交部分的面积。
在求解相交部分的面积的时候,我们分别从横轴上看,从纵轴上看。
图中①是从横轴上看,相交的两种情况。
图中②是从纵轴上看,相交的两种情况。
(注意,只有当横纵轴都满足相交条件,二维平面中的图形才是相交的)
依据图①②可做如下分析:
图①:无论A,E哪个在前,无论C,G哪个在后,CG中靠左的那一个减去AE中靠右的那个,得到的就是重叠部分矩形的长。
而靠左,体现在代码中,就是求min(C, G)
;靠右,体现在代码中,就是求max(A, E)
。
图②:同上。
总结:数学大法好!