forked from TheAlgorithms/Python
- Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathlargest_rectangle_histogram.py
39 lines (29 loc) · 1.05 KB
/
largest_rectangle_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
deflargest_rectangle_area(heights: list[int]) ->int:
"""
Inputs an array of integers representing the heights of bars,
and returns the area of the largest rectangle that can be formed
>>> largest_rectangle_area([2, 1, 5, 6, 2, 3])
10
>>> largest_rectangle_area([2, 4])
4
>>> largest_rectangle_area([6, 2, 5, 4, 5, 1, 6])
12
>>> largest_rectangle_area([1])
1
"""
stack: list[int] = []
max_area=0
heights= [*heights, 0] # make a new list by appending the sentinel 0
n=len(heights)
foriinrange(n):
# make sure the stack remains in increasing order
whilestackandheights[i] <heights[stack[-1]]:
h=heights[stack.pop()] # height of the bar
# if stack is empty, it means entire width can be taken from index 0 to i-1
w=iifnotstackelsei-stack[-1] -1# calculate width
max_area=max(max_area, h*w)
stack.append(i)
returnmax_area
if__name__=="__main__":
importdoctest
doctest.testmod()