-
Notifications
You must be signed in to change notification settings - Fork 17
/
largest-rectangle-in-histogram.py
43 lines (29 loc) · 1.12 KB
/
largest-rectangle-in-histogram.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
from typing import List
class Solution:
def largestRectangleArea(self, heights: List[int]) -> int:
stack: List[int] = []
area = 0
heights.append(0)
for pos in range(len(heights)):
while stack and heights[stack[-1]] >= heights[pos]:
last_pos = stack.pop()
prev_less = stack[-1] if stack else -1
area = max(area, (pos - (prev_less + 1)) * heights[last_pos])
stack.append(pos)
return area
def largest_rectangle(histogram: List[int]) -> int:
histogram.append(0)
stack: List[int] = []
max_rectangle = 0
for right_pos in range(len(histogram)):
while stack and histogram[stack[-1]] > histogram[right_pos]:
smallest_pos = stack.pop()
left_pos = stack[-1] + 1 if stack else 0
max_rectangle = max(
max_rectangle, histogram[smallest_pos] * (right_pos - left_pos)
)
stack.append(right_pos)
return max_rectangle
class Solution2:
def largestRectangleArea(self, heights: List[int]) -> int:
return largest_rectangle(heights)