LeetCode 完美矩形

2021-09-12 17:49:05 字數 2469 閱讀 3395

我們有 n 個與座標軸對齊的矩形, 其中 n > 0, 判斷它們是否能精確地覆蓋乙個矩形區域。

每個矩形用左下角的點和右上角的點的座標來表示。例如, 乙個單位正方形可以表示為 [1,1,2,2]。 ( 左下角的點的座標為 (1, 1) 以及右上角的點的座標為 (2, 2) )。

示例 1:

rectangles = [

[1,1,3,3],

[3,1,4,2],

[3,2,4,4],

[1,3,2,4],

[2,3,3,4]

]返回 true。5個矩形一起可以精確地覆蓋乙個矩形區域。

示例 2:

rectangles = [

[1,1,2,3],

[1,3,2,4],

[3,1,4,2],

[3,2,4,4]

]返回 false。兩個矩形之間有間隔,無法覆蓋成乙個矩形。

示例 3:

rectangles = [

[1,1,3,3],

[3,1,4,2],

[1,3,2,4],

[3,2,4,4]

]返回 false。圖形頂端留有間隔,無法覆蓋成乙個矩形。

示例 4:

rectangles = [

[1,1,3,3],

[3,1,4,2],

[1,3,2,4],

[2,2,4,4]

]返回 false。因為中間有相交區域,雖然形成了矩形,但不是精確覆蓋。

思路分析:如果所有小矩形能夠拼湊成大矩形,那麼所有小矩形的面積和必定和大矩形的面積相等,且大矩形被小矩形完全覆蓋。

方法一:蠻力法。

class solution 

//尋找大矩形的可能最有上角的下標

if (rightuprow + rightupcol < rectangle[2] + rectangle[3])

}//如果所有小矩形的面積和和可能的最大矩形面積不相等,說明不能構成大矩形

if ((long long)(rightuprow - leftdownrow) * (long long)(rightupcol - leftdowncol) != area)

//將大矩形所有節點標記

map, bool> mymap;

for (int row = leftdownrow; row < rightuprow; ++row)

}//遍歷所有小矩形

方法二:並不將所有大矩形中的點進行標記,而是從放入的小矩形入手,將矩形兩點表示修改為四點表示。每次訪問乙個小矩形都嘗試將其四個頂點放入set,如果某個點之前set就存在,那麼移除,否則放入集合。如果是完美矩形,那麼最後set剩餘的必定是大矩形的四個角。因為如果是完美矩形,其他點必定出現偶數次。

class solution ) == myset.end()));

}else);

}//右上角

if (myset.find() == myset.end()));

}else);

}//左上角

if (myset.find() == myset.end()));

}else);

}//右下角

if (myset.find() == myset.end()));

}else);}}

//如果是完美矩形,最後必定只剩四個點

Leetcode 391 完美矩形

我們有 n 個與座標軸對齊的矩形,其中 n 0,判斷它們是否能精確地覆蓋乙個矩形區域。每個矩形用左下角的點和右上角的點的座標來表示。例如,乙個單位正方形可以表示為 1,1,2,2 左下角的點的座標為 1,1 以及右上角的點的座標為 2,2 示例 1 rectangles 1,1,3,3 3,1,4,...

391 完美矩形

給你乙個陣列 rectangles 其中 rectangles i xi,yi,ai,bi 表示乙個座標軸平行的矩形。這個矩形的左下頂點是 xi,yi 右上頂點是 ai,bi 如果所有矩形一起精確覆蓋了某個矩形區域,則返回 true 否則,返回 false 示例 1 輸入 rectangles 1,...

391 完美矩形問題

我們有 n 個與座標軸對齊的矩形,其中n 0,判斷它們是否能精確地覆蓋乙個矩形區域。每個矩形用左下角的點和右上角的點的座標來表示。例如,乙個單位正方形可以表示為 1,1,2,2 左下角的點的座標為 1,1 以及右上角的點的座標為 2,2 示例 1 rectangles 1,1,3,3 3,1,4,2...