Discover how a simple stack can turn a slow, tiring problem into a quick and clever solution!
Why Largest Rectangle in Histogram Using Stack in DSA Typescript?
Imagine you have a row of buildings with different heights, and you want to find the largest flat area you can cover by choosing some consecutive buildings. Doing this by checking every possible group of buildings one by one is like measuring every possible rectangle by hand.
Manually checking every group of buildings is very slow and tiring. It takes a lot of time because you have to look at many combinations, and it's easy to make mistakes counting or missing some groups.
Using a stack helps keep track of building heights in a smart way. It lets you quickly find the biggest rectangle by remembering where heights start and end, so you don't have to check every group manually. This makes the process fast and simple.
function largestRectangleArea(heights: number[]): number {
let maxArea = 0;
for (let i = 0; i < heights.length; i++) {
for (let j = i; j < heights.length; j++) {
let minHeight = Math.min(...heights.slice(i, j + 1));
maxArea = Math.max(maxArea, minHeight * (j - i + 1));
}
}
return maxArea;
}function largestRectangleArea(heights: number[]): number {
const stack: number[] = [];
let maxArea = 0;
for (let i = 0; i <= heights.length; i++) {
while (stack.length && (i === heights.length || heights[i] < heights[stack[stack.length - 1]])) {
const height = heights[stack.pop()!];
const width = stack.length ? i - stack[stack.length - 1] - 1 : i;
maxArea = Math.max(maxArea, height * width);
}
stack.push(i);
}
return maxArea;
}This method lets you quickly find the largest rectangle in a histogram, making it easy to solve problems about areas and heights efficiently.
Think about packing boxes of different heights on a shelf and wanting to find the biggest flat space to place a new box. This method helps find that space fast.
Manual checking of all groups is slow and error-prone.
Stack helps track heights and widths smartly for fast calculation.
Enables quick finding of largest rectangle in a histogram.
Practice
Solution
Step 1: Understand the stack's role
The stack stores indices of bars in increasing height order to find boundaries for rectangles.Step 2: Why increasing heights?
This helps identify when a bar is lower than the previous, signaling to calculate area for taller bars.Final Answer:
To keep track of bars' indices with increasing heights -> Option BQuick Check:
Stack tracks increasing bars = To keep track of bars' indices with increasing heights [OK]
- Thinking stack sorts bars by height
- Using stack to store areas instead of indices
- Ignoring the order of bars in the stack
Solution
Step 1: Identify correct stack type
We need a stack of numbers (indices), so number[] is correct.Step 2: Check other options
const stack: string[] = []; uses string[], wrong type. const stack = new Stack<number>(); uses a Stack class which is not standard in TypeScript. const stack = []; stack.push('index'); pushes a string 'index', wrong type.Final Answer:
const stack: number[] = []; -> Option CQuick Check:
Stack of numbers = const stack: number[] = []; [OK]
- Using string[] instead of number[]
- Assuming Stack class exists by default
- Pushing wrong data types into stack
function largestRectangleArea(heights: number[]): number {
const stack: number[] = [];
let maxArea = 0;
heights.push(0);
for (let i = 0; i < heights.length; i++) {
while (stack.length && heights[i] < heights[stack[stack.length - 1]]) {
const height = heights[stack.pop()!];
const width = stack.length ? i - stack[stack.length - 1] - 1 : i;
maxArea = Math.max(maxArea, height * width);
}
stack.push(i);
}
return maxArea;
}
console.log(largestRectangleArea([2, 1, 5, 6, 2, 3]));Solution
Step 1: Add sentinel and iterate
Heights become [2,1,5,6,2,3,0]. We use stack to track indices of increasing bars.Step 2: Calculate max area during pops
Pop bars when current height is less, calculate area: max area found is 10 (from bars 5 and 6 with width 2).Final Answer:
10 -> Option AQuick Check:
Max rectangle area = 10 [OK]
- Not adding sentinel 0 at end
- Wrong width calculation after popping
- Ignoring last bars in stack
function largestRectangleArea(heights: number[]): number {
const stack: number[] = [];
let maxArea = 0;
for (let i = 0; i <= heights.length; i++) {
while (stack.length && heights[i] < heights[stack[stack.length - 1]]) {
const height = heights[stack.pop()!];
const width = stack.length ? i - stack[stack.length - 1] - 1 : i;
maxArea = Math.max(maxArea, height * width);
}
stack.push(i);
}
return maxArea;
}Solution
Step 1: Check loop boundary
The loop runs i from 0 to heights.length inclusive, so heights[i] is accessed when i == heights.length, causing out-of-bounds error.Step 2: Fix by adding sentinel or changing loop
Adding a 0 height at end or changing loop to i < heights.length fixes this.Final Answer:
Loop goes out of bounds accessing heights[i] when i == heights.length -> Option DQuick Check:
Out-of-bounds access = Loop goes out of bounds accessing heights[i] when i == heights.length [OK]
- Ignoring loop boundary causing runtime error
- Assuming stack initialization is wrong
- Misreading width calculation
Solution
Step 1: Use stack to find max area
Push indices while heights increase. When a lower bar appears, pop and calculate area. For this histogram, max area is 12 from bars at indices 2,3,4 (heights 5,4,5) width 3.Step 2: Why area 12 is largest
The rectangle covers bars with heights >=4 over width 3, area = 4*3=12. No other rectangle covers more area.Final Answer:
12 -> Option AQuick Check:
Max rectangle area = 12 [OK]
- Calculating area only for single bars
- Ignoring width when popping multiple bars
- Missing the largest rectangle spanning multiple bars
Ready to prove it?
Pass the test and this pattern moves unknown
