【LeetCode通關(guān)全記錄】223. 矩形面積
題目地址:223. 矩形面積
解法:面積之和-重疊面積
看到這道題你可能認(rèn)為需要考慮各種情況(比如兩個矩形有沒有重疊,大矩形包小矩形會怎樣等等)來求解了杜耙,其實(shí)仔細(xì)想想就能發(fā)現(xiàn)這題本質(zhì)上就是求兩個矩形的重疊面積逾滥,因?yàn)閮蓚€矩形的實(shí)際覆蓋面積就是兩個矩形的面積之和減去它們的重疊面積拖叙。那么問題就轉(zhuǎn)化為如何求重疊部分的面積了刻诊。這也很簡單矗烛,重疊面積的寬度w
為math.Min(ax2, bx2) - math.Max(ax1, bx1)
趴泌,高度h
為math.Min(ay2, by2) - math.Min(ay1, by1)
告组,若其中某一個為負(fù)數(shù)則將其置為0煤伟,求出w
和h
之后計(jì)算出兩個矩形的面積并減去w * h
就可以了。
注意:如果想繼續(xù)優(yōu)化的話木缝,可以自己實(shí)現(xiàn)針對int類型的min
和max
兩個函數(shù)便锨,這樣可以比頻繁地進(jìn)行類型轉(zhuǎn)換更快一些。
func computeArea(ax1 int, ay1 int, ax2 int, ay2 int, bx1 int, by1 int, bx2 int, by2 int) int {
// 求重疊部分的長和寬
w := math.Max(0, math.Min(float64(ax2), float64(bx2)) - math.Max(float64(ax1), float64(bx1)))
h := math.Max(0, math.Min(float64(ay2), float64(by2)) - math.Max(float64(ay1), float64(by1)))
// 實(shí)際覆蓋面積 = 兩個矩形的面積之和 - 重疊部分面積
return (ay2 - ay1) * (ax2 - ax1) + (by2 - by1) * (bx2 - bx1) - (int(w) * int(h))
}
執(zhí)行用時: 16 ms(超過40%的Golang提交記錄)
內(nèi)存消耗: 6.2 MB(超過67%的Golang提交記錄)
時間復(fù)雜度:O(1)我碟,問題的規(guī)模與算法執(zhí)行效率無關(guān)放案;
空間復(fù)雜度:O(1),只使用了常數(shù)個數(shù)的存儲空間矫俺。