What if you could find the biggest space hidden in a city skyline without measuring every inch by hand?
Why Largest Rectangle in Histogram Using Stack in DSA Javascript?
Imagine you have a row of buildings of different heights, and you want to find the largest rectangular area that can fit inside these buildings. Doing this by checking every possible rectangle manually is like trying to measure every possible box inside a city skyline by hand.
Manually checking every rectangle means looking at all pairs of buildings and calculating areas, which takes a very long time as the number of buildings grows. It's easy to make mistakes and miss the largest area because there are so many possibilities.
Using a stack helps keep track of building heights in a smart way. It lets us quickly find the largest rectangle by remembering where heights start and end, so we don't have to check every pair. This makes the process fast and reliable.
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)); } }
const stack = []; 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); }
This method allows you to find the largest rectangle in a histogram quickly, even for very large sets of buildings, making complex skyline problems easy to solve.
Architects and city planners can use this to find the largest possible billboard or advertisement space on a row of buildings without overlapping, saving time and effort.
Manual checking is slow and error-prone for large data.
Stack helps track building heights efficiently.
Enables fast calculation of largest rectangle area.
Practice
Solution
Step 1: Understand the role of the stack
The stack stores indices of bars in increasing height order to help calculate areas efficiently.Step 2: Explain why this helps
When a smaller bar is found, the stack helps find the largest rectangle with the previous taller bars as height.Final Answer:
To keep track of bars' indices with increasing heights -> Option CQuick 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 stack data structure in JavaScript
Stacks are implemented using arrays, so initializing with [] is correct.Step 2: Explain why other options are incorrect
{ } is an object, null is no structure, 0 is a number, none suitable for stack operations.Final Answer:
const stack = []; -> Option BQuick Check:
Stack as array = const stack = [] [OK]
- Using object {} instead of array
- Assigning null or number instead of array
- Confusing stack with other data structures
function largestRectangleArea(heights) {
const stack = [];
let maxArea = 0;
for (let i = 0; i <= heights.length; i++) {
const h = i === heights.length ? 0 : heights[i];
while (stack.length && h < 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: Trace the stack and area calculation
Process bars: max area updates to 10 (5*2), final max area is 10.Step 2: Confirm final max area
Largest rectangle covers bars with heights 5 and 6, width 2, area 10.Final Answer:
10 -> Option DQuick Check:
Largest rectangle area = 10 [OK]
- Calculating area without considering width correctly
- Not popping all taller bars from stack
- Forgetting to add a zero height bar at end
function largestRectangleArea(heights) {
const stack = [];
let maxArea = 0;
for (let i = 0; i <= heights.length; i++) {
const h = i === heights.length ? 0 : heights[i];
while (stack.length && h < heights[stack[stack.length - 1]]) {
const height = heights[stack.pop()];
const width = i - stack[stack.length - 1];
maxArea = Math.max(maxArea, height * width);
}
stack.push(i);
}
return maxArea;
}Solution
Step 1: Analyze width calculation
Width should be i - stack top - 1, but code misses subtracting 1, causing wrong width.Step 2: Explain impact of bug
Incorrect width leads to overestimating area, so maxArea may be wrong.Final Answer:
Width calculation misses subtracting 1 -> Option AQuick Check:
Width = i - stack top - 1 needed [OK]
- Using heights instead of indices in stack
- Not adding a zero height bar at end
- Incorrect loop boundary causing missed bars
Solution
Step 1: Use stack to find largest rectangle
Process bars: largest rectangle covers bars with heights 5,4,5 (indices 2 to 4), min height 4, width 3, area = 12. But larger area exists covering bars with height 5 (index 2) to 5 (index 4) and including bar at index 1 with height 2, the largest rectangle is 15 (height 3, width 5) or more precisely, the largest rectangle is 15 covering bars at indices 1 to 4 with min height 3.Step 2: Confirm no larger area exists
Largest rectangle area is 15.Final Answer:
15 -> Option AQuick Check:
Largest rectangle area = 15 [OK]
- Calculating area without considering width correctly
- Not popping all taller bars before pushing new bar
- Ignoring the last bar by not adding zero height at end
Ready to prove it?
Pass the test and this pattern moves unknown
