What if you could find the biggest flat space in a city skyline without measuring every single possibility?
Why Largest Rectangle in Histogram Using Stack in DSA C++?
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--very tiring and slow!
Manually checking all possible rectangles means looking at every pair of buildings and calculating areas, which takes a lot of time and effort. It's easy to make mistakes, miss some rectangles, or waste time repeating calculations.
Using a stack helps keep track of building heights in a smart way. It lets you quickly find the largest rectangle by remembering where heights start and end, so you don't have to check every pair. This method is fast and avoids repeated work.
int maxArea = 0; for (int i = 0; i < n; i++) { for (int j = i; j < n; j++) { int minHeight = INT_MAX; for (int k = i; k <= j; k++) { minHeight = min(minHeight, heights[k]); } maxArea = max(maxArea, minHeight * (j - i + 1)); } }
stack<int> indices; int maxArea = 0; for (int i = 0; i <= n; i++) { while (!indices.empty() && (i == n || heights[i] < heights[indices.top()])) { int height = heights[indices.top()]; indices.pop(); int width = indices.empty() ? i : i - indices.top() - 1; maxArea = max(maxArea, height * width); } indices.push(i); }
This method makes it possible to find the largest rectangle in a histogram quickly and efficiently, even for very large sets of buildings.
Think about a city planner who needs to find the biggest flat area in a row of buildings to place a billboard or a park. Using this method, they can quickly decide the best spot without checking every possible area manually.
Manual checking of all rectangles is slow and error-prone.
Stack helps track building heights and widths efficiently.
Largest rectangle can be found quickly with less repeated work.
Practice
Solution
Step 1: Understand the role of stack in the problem
The stack is used to store indices of bars in increasing order of their heights to efficiently calculate areas.Step 2: Why increasing order indices?
When a bar with smaller height is found, we pop from the stack to calculate the largest rectangle possible with the popped bar as the smallest height.Final Answer:
To keep track of indices of bars with increasing heights -> Option AQuick Check:
Stack stores indices in increasing height order = A [OK]
- Thinking stack stores heights instead of indices
- Assuming stack sorts bars by height
- Using stack to count bars instead of tracking indices
Solution
Step 1: Check correct stack declaration syntax in C++
The correct way to declare an empty stack of integers isstack<int> s;.Step 2: Identify errors in other options
stack<int> s = new stack<int>(); uses 'new' which is incorrect for stack initialization. stack s<int>; has wrong template syntax. stack<int> s[]; declares an array of stacks, not a single stack.Final Answer:
stack<int> s; -> Option CQuick Check:
Correct stack declaration = C [OK]
- Using 'new' keyword incorrectly with stack
- Wrong template syntax like stack s<int>
- Declaring array of stacks instead of single stack
int largestRectangleArea(vector<int>& heights) {
stack<int> s;
int max_area = 0, i = 0;
while (i < heights.size()) {
if (s.empty() || heights[i] >= heights[s.top()]) {
s.push(i++);
} else {
int tp = s.top(); s.pop();
int area = heights[tp] * (s.empty() ? i : i - s.top() - 1);
max_area = max(max_area, area);
}
}
while (!s.empty()) {
int tp = s.top(); s.pop();
int area = heights[tp] * (s.empty() ? i : i - s.top() - 1);
max_area = max(max_area, area);
}
return max_area;
}
cout << largestRectangleArea({2,1,5,6,2,3});Solution
Step 1: Trace the stack operations and area calculations
For heights [2,1,5,6,2,3], the largest rectangle area is 10 (from bars 5 and 6 with width 2).Step 2: Confirm final max_area value
After processing all bars and stack cleanup, max_area is 10.Final Answer:
10 -> Option BQuick Check:
Largest rectangle area = 10 [OK]
- Miscomputing width when popping from stack
- Forgetting to process remaining stack after loop
- Mixing up indices and heights in area calculation
int largestRectangleArea(vector<int>& heights) {
stack<int> s;
int max_area = 0, i = 0;
while (i < heights.size()) {
if (s.empty() || heights[i] >= heights[s.top()]) {
s.push(i++);
} else {
int tp = s.top(); s.pop();
int area = heights[tp] * (s.empty() ? i : i - s.top() - 1);
max_area = max(max_area, area);
}
}
while (!s.empty()) {
int tp = s.top(); s.pop();
int area = heights[tp] * (s.empty() ? i : i - s.top() - 1);
max_area = max(max_area, area);
}
return max_area;
}Solution
Step 1: Analyze width calculation formula
The width should bei - s.top() - 1but code usesi - s.top(), missing the '-1'.Step 2: Effect of missing '-1'
This causes overestimation of width and incorrect area calculation.Final Answer:
Width calculation misses subtracting 1 from index difference -> Option AQuick Check:
Width = i - s.top() - 1 needed [OK]
- Using i - s.top() instead of i - s.top() - 1
- Not incrementing i in else block (but here it is correct)
- Wrong comparison operator in if condition
Solution
Step 1: Use stack to track indices of increasing heights
Push indices while heights increase: indices 0(6), then 1(2) triggers pop of 0, area=6*1=6. Continue pushing and popping to calculate areas.Step 2: Calculate max area by popping stack when current height is less
Largest rectangle area found is 15 (from bars at indices 2,3,4 with min height 5 and width 3).Final Answer:
15 -> Option DQuick Check:
Largest rectangle area = 15 [OK]
- Not popping stack correctly when height decreases
- Incorrect width calculation during area computation
- Ignoring last stack cleanup after main loop
Ready to prove it?
Pass the test and this pattern moves unknown
