0
0
DSA Pythonprogramming~10 mins

Largest Rectangle in Histogram Using Stack in DSA Python - Execution Trace

Choose your learning style9 modes available
Concept Flow - Largest Rectangle in Histogram Using Stack
Start with empty stack
Iterate over bars by index
While stack not empty and current bar height < height at stack top
Pop from stack
Calculate area with popped bar as smallest
Update max area if needed
Push current index to stack
After iteration, pop remaining bars
Calculate area for each popped bar
Update max area if needed
Return max area
We scan bars left to right, using a stack to keep indexes of bars in ascending height. When a lower bar appears, we pop taller bars to calculate areas, updating max area.
Execution Sample
DSA Python
def largest_rectangle(heights):
    stack = []
    max_area = 0
    for i, h in enumerate(heights):
        while stack and heights[stack[-1]] > h:
            height = heights[stack.pop()]
            width = i if not stack else i - stack[-1] - 1
            max_area = max(max_area, height * width)
        stack.append(i)
    while stack:
        height = heights[stack.pop()]
        width = len(heights) if not stack else len(heights) - stack[-1] - 1
        max_area = max(max_area, height * width)
    return max_area
Calculates largest rectangle area in histogram by using a stack to track bars and computing areas when a smaller bar is found.
Execution Table
StepOperationCurrent IndexStack BeforeStack AfterArea CalculatedMax AreaVisual State
1Start-[][]-0[]
2Push index 0 (height 2)0[][0]-0[2]
3Current height 1 < height at stack top (2), pop index 01[0][]2 * 1 = 22[]
4Push index 1 (height 1)1[][1]-2[1]
5Current height 5 > stack top height 1, push index 22[1][1,2]-2[1,5]
6Current height 6 > stack top height 5, push index 33[1,2][1,2,3]-2[1,5,6]
7Current height 2 < stack top height 6, pop index 34[1,2,3][1,2]6 * (4-2-1)=66[1,5]
8Current height 2 < stack top height 5, pop index 24[1,2][1]5 * (4-1-1)=1010[1]
9Current height 2 > stack top height 1, push index 44[1][1,4]-10[1,2]
10Current height 3 > stack top height 2, push index 55[1,4][1,4,5]-10[1,2,3]
11End of array reached, pop remaining stack, pop index 5-[1,4,5][1,4]3 * (6-4-1)=310[1,2]
12Pop index 4-[1,4][1]2 * (6-1-1)=810[1]
13Pop index 1-[1][]1 * 6 = 610[]
14Return max area-[][]-10[]
💡 All bars processed and stack emptied, max area found is 10
Variable Tracker
VariableStartAfter Step 2After Step 3After Step 4After Step 5After Step 6After Step 7After Step 8After Step 9After Step 10After Step 11After Step 12After Step 13Final
stack[][0][][1][1,2][1,2,3][1,2][1][1,4][1,4,5][1,4][1][][]
max_area002222610101010101010
current_index-011234445----
Key Moments - 3 Insights
Why do we pop from the stack when the current bar is lower than the bar at the stack's top?
Because the current lower bar means the previous taller bars cannot extend further right, so we calculate the area for those bars now (see steps 7 and 8 in execution_table).
How do we calculate the width for the popped bar's rectangle?
Width is the distance between the current index and the index on the new top of the stack after popping, minus one. If stack is empty, width is current index (or total length at end). See steps 7,8,12 in execution_table.
Why do we process remaining bars in the stack after finishing the iteration?
Because those bars extend to the end of the histogram, so we calculate their areas using the total length as right boundary (see steps 11-13).
Visual Quiz - 3 Questions
Test your understanding
Look at the execution_table at step 8, what is the max_area after popping index 2?
A10
B8
C6
D12
💡 Hint
Check the 'Max Area' column at step 8 in execution_table.
At which step does the stack become empty for the first time?
AStep 12
BStep 13
CStep 14
DStep 10
💡 Hint
Look at the 'Stack After' column to find when it changes to [].
If the input histogram had all bars of equal height, how would the max_area compare to the number of bars?
Amax_area equals number of bars only
Bmax_area equals height only
Cmax_area equals height times number of bars
Dmax_area is zero
💡 Hint
Refer to variable_tracker and think about how width is calculated when stack is never popped early.
Concept Snapshot
Largest Rectangle in Histogram Using Stack:
- Use a stack to store indices of bars in ascending height.
- Iterate bars, pop stack when current bar is lower to calculate area.
- Calculate width using current index and stack top after pop.
- After iteration, pop remaining bars to calculate areas.
- Max area updated during pops, final max area returned.
Full Transcript
This concept finds the largest rectangle area in a histogram using a stack. We keep indices of bars in ascending order. When a lower bar appears, we pop taller bars to calculate areas with those bars as the smallest height. Width is calculated based on current index and the new top of the stack. After processing all bars, we pop remaining bars to calculate their areas considering the histogram's end. The maximum area found during these steps is returned as the result.