給你乙個陣列 rectangles ,其中 rectangles[i] = [xi, yi, ai, bi] 表示乙個座標軸平行的矩形。這個矩形的左下頂點是 (xi, yi) ,右上頂點是 (ai, bi) 。
如果所有矩形一起精確覆蓋了某個矩形區域,則返回 true ;否則,返回 false 。
示例 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
解釋:因為中間有相交區域,雖然形成了矩形,但不是精確覆蓋。
思路1:①求所有矩形的面積和s_sum
②求所有點所能構成的最大矩形面積s_max
③判斷s_sum==s_max
④通過矩形之間的交集判斷是否存在重疊
第④步複雜度o(n)^2,超時.
思路2:求所有點在矩形**現的次數,乙個合格的矩形應該只有4個只出現一次的點,同時其他點都是成對存在,比如不會有乙個點出現在3個矩形頂點中的情況.
求出這4個唯一的頂點之後,計算這4個頂點所圍成的面積是否等於所有矩形的面積和
1from typing import
list23
4class
solution:
5def isrectanglecover(self, rectangles: list[list[int]]) ->bool:
6 sum_area =0
78 point_map ={}910
for rectangle in
rectangles:
11 sum_area +=self.compute_area(rectangle)
12 points =self.get_all_points(rectangle)
13for point in
points:
14if
point_map.get(point, false):
15 point_map[point] += 1
16else
:17 point_map[point] = 1
18return
self.is_legal(point_map, sum_area)
1920
defcompute_area(self, rectangle):
21 x1, y1, x2, y2 =rectangle
22 width = abs(x2 -x1)
23 height = abs(y2 -y1)
24return width *height
2526
defget_all_points(self, rectangle):
27 x1, y1, x2, y2 =rectangle
28 left_down =(x1, y1)
29 left_up =(x1, y2)
30 right_down =(x2, y1)
31 right_up =(x2, y2)
32return
[left_down, left_up, right_down, right_up]
3334
defis_legal(self, point_map, sum_area):
35 single_points_times =0
3637 x1_min = float('
inf'
)38 y1_min = float('
inf'
)39 x2_max = -float('
inf'
)40 y2_max = -float('
inf')41
42for k, v in
point_map.items():
43if v == 1:
44 single_points_times += 1
45 x1_min =min(x1_min, k[0])
46 y1_min = min(y1_min, k[1])
47 x2_max =max(x2_max, k[0])
48 y2_max = max(y2_max, k[1])
49elif v % 2 == 1:
50return
false
51return single_points_times == 4 and sum_area ==self.compute_area([x1_min, y1_min, x2_max, y2_max])
525354#
def has_overlap(self, rectanglea, rectangleb):55#
a_x1, a_y1, a_x2, a_y2 = rectanglea56#
b_x1, b_y1, ba_x2, b_y2 = rectangleb57#
left = max(a_x1, b_x1)58#
right = min(a_x2, ba_x2)59#
top = min(a_y2, b_y2)60#
bottom = max(a_y1, b_y1)61#
return not (left >= right or bottom >= top)
391 完美矩形問題
我們有 n 個與座標軸對齊的矩形,其中n 0,判斷它們是否能精確地覆蓋乙個矩形區域。每個矩形用左下角的點和右上角的點的座標來表示。例如,乙個單位正方形可以表示為 1,1,2,2 左下角的點的座標為 1,1 以及右上角的點的座標為 2,2 示例 1 rectangles 1,1,3,3 3,1,4,2...
Leetcode 391 完美矩形
我們有 n 個與座標軸對齊的矩形,其中 n 0,判斷它們是否能精確地覆蓋乙個矩形區域。每個矩形用左下角的點和右上角的點的座標來表示。例如,乙個單位正方形可以表示為 1,1,2,2 左下角的點的座標為 1,1 以及右上角的點的座標為 2,2 示例 1 rectangles 1,1,3,3 3,1,4,...
力扣 391 完美矩形 Python題解
我們有 n 個與座標軸對齊的矩形,其中 n 0,判斷它們是否能精確地覆蓋乙個矩形區域。每個矩形用左下角的點和右上角的點的座標來表示。例如,乙個單位正方形可以表示為 1,1,2,2 左下角的點的座標為 1,1 以及右上角的點的座標為 2,2 示例 1 rectangles 1,1,3,3 3,1,4,...