我們有 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...