391 完美矩形

2022-09-08 09:48:11 字數 3299 閱讀 2570

給你乙個陣列 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個頂點所圍成的面積是否等於所有矩形的面積和

1

from 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,...