1+ import heapq
2+
3+ class Node :
4+ def __init__ (self , left , right , height , width ):
5+ self .left = left
6+ self .right = right
7+ self .height = height
8+ self .width = width
9+ self .deleted = False
10+
11+ def __eq__ (self , other ):
12+ return self .height == other .height
13+
14+ def __lt__ (self , other ):
15+ return self .height * - 1 < other .height * - 1
16+
17+ def del_right_node (node ):
18+ node .width += node .right .width
19+ node .height = node .right .height
20+ node .right .deleted = True
21+ node .right = node .right .right
22+ if node .right :
23+ node .right .left = node
24+
25+ def del_left_node (node ):
26+ node .width += node .left .width
27+ node .height = node .left .height
28+ node .left .deleted = True
29+ node .left = node .left .left
30+ if node .left :
31+ node .left .right = node
32+
33+ def print_ll (node ):
34+ while node .left :
35+ node = node .left
36+
37+ print ("---" )
38+
39+ while node :
40+ print ("height: " , node .height , ", width" , node .width )
41+ node = node .right
42+
43+ class Solution :
44+ def largestRectangleArea (self , heights : List [int ]) -> int :
45+ ll = None
46+ heap = []
47+
48+ m = 0
49+
50+ for height in heights :
51+ m = max (m , height )
52+ prev = ll
53+ ll = Node (ll , None , height , 1 )
54+ if prev :
55+ prev .right = ll
56+ heapq .heappush (heap , ll )
57+
58+ while heap :
59+ node = heapq .heappop (heap )
60+ if node .deleted :
61+ continue
62+
63+ if node .left and node .right :
64+ if node .left .height < node .right .height :
65+ del_right_node (node )
66+ else :
67+ del_left_node (node )
68+ elif node .left :
69+ del_left_node (node )
70+ elif node .right :
71+ del_right_node (node )
72+ else :
73+ continue
74+
75+ heapq .heappush (heap , node )
76+
77+ m = max (m , node .height * node .width )
78+
79+ return m
80+
0 commit comments