The Largest Rectangle in Histogram problem involves finding the largest rectangular area that can be formed in a histogram represented by an array of heights. This can be efficiently solved using a stack to manage the indices of the histogram bars.
Consider a histogram represented by the following array of heights:
[2, 1, 5, 6, 2, 3]
To find the largest rectangular area in this histogram using a stack, follow these steps:
After performing these steps, the largest rectangular area in the histogram will be found.
Input: [2, 1, 5, 6, 2, 3]
Output: 10
Function largest_rectangle_area(heights):
# Initialize an empty stack
stack = []
max_area = 0
index = 0
# Traverse the array
While index < len(heights):
# Push the current index onto the stack if the stack is empty or the current height is greater than the height at the stack's top index
If not stack or heights[index] >= heights[stack[-1]]:
stack.append(index)
index += 1
Else:
# Pop the top index from the stack
top_of_stack = stack.pop()
# Calculate the area with the popped index as the smallest bar
area = (heights[top_of_stack] * ((index - stack[-1] - 1) if stack else index))
# Update max_area if the calculated area is greater
max_area = max(max_area, area)
# Calculate area for the remaining bars in the stack
While stack:
top_of_stack = stack.pop()
area = (heights[top_of_stack] * ((index - stack[-1] - 1) if stack else index))
max_area = max(max_area, area)
Return max_area
class Stack:
def __init__(self):
self.stack = []
def push(self, data):
self.stack.append(data)
def pop(self):
if not self.is_empty():
return self.stack.pop()
return None
def peek(self):
if not self.is_empty():
return self.stack[-1]
return None
def is_empty(self):
return len(self.stack) == 0
def traverse(self):
for item in reversed(self.stack):
print(item, end=" -> ")
print("None")
# Function to find the largest rectangular area in a histogram
def largest_rectangle_area(heights):
stack = Stack()
max_area = 0
index = 0
while index < len(heights):
if stack.is_empty() or heights[index] >= heights[stack.peek()]:
stack.push(index)
index += 1
else:
top_of_stack = stack.pop()
area = (heights[top_of_stack] * ((index - stack.peek() - 1) if not stack.is_empty() else index))
max_area = max(max_area, area)
while not stack.is_empty():
top_of_stack = stack.pop()
area = (heights[top_of_stack] * ((index - stack.peek() - 1) if not stack.is_empty() else index))
max_area = max(max_area, area)
return max_area
# Example usage:
histogram = [2, 1, 5, 6, 2, 3]
print(f"Histogram: {histogram}") # Output: Histogram: [2, 1, 5, 6, 2, 3]
max_area = largest_rectangle_area(histogram)
print(f"Largest rectangle area: {max_area}") # Output: Largest rectangle area: 10
This Python program defines a stack with methods for pushing, popping, peeking, checking if the stack is empty, and traversing the stack. The largest_rectangle_area function uses the stack to find the largest rectangular area in a histogram by processing each bar, comparing it with the stack's top element, and updating the maximum area accordingly.