原題鏈接: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)
。
圖②:同上。
總結:數學大法好!