hard Largest Rectangle in Histogram
Problem Statement
Given an array of integers heights, where heights[i] represents the height of the histogram's bar, return the area of the largest rectangle in the histogram. Each bar has width equal to 1.
Examples
- Example 1:
- Input:
[4, 2, 3, 2]
- Input:
-
Expected Output:
8 -
Justification: The largest rectangle can be drawn from the first bar to the fourth bar, having height
2, resulting in an area of2x4=8. -
Example 2:
- Input:
[1,3,4,5,2]
- Input:
-
Expected Output:
9 -
Justification: The largest rectangle can be drawn from the second bar to the fourth bar, having height
3, resulting in an area of3x3=9. -
Example 3:
- Input:
[6,2,5,4,5,1,6]
- Input:
- Expected Output:
12 - Justification: The maximum rectangular area is formed by the bars of heights
5,4,5, which is equal to4x3=12. This rectangle spans from the third to the sixth bar.
Try it yourself
Try solving this question here:
✅ Solution Largest Rectangle in Histogram
Problem Statement
Given an array of integers heights, where heights[i] represents the height of the histogram's bar, return the area of the largest rectangle in the histogram. Each bar has width equal to 1.
Examples
- Example 1:
- Input:
[4, 2, 3, 2]
- Input:
-
Expected Output:
8 -
Justification: The largest rectangle can be drawn from the first bar to the fourth bar, having height
2, resulting in an area of2x4=8. -
Example 2:
- Input:
[1,3,4,5,2]
- Input:
-
Expected Output:
9 -
Justification: The largest rectangle can be drawn from the second bar to the fourth bar, having height
3, resulting in an area of3x3=9. -
Example 3:
- Input:
[6,2,5,4,5,1,6]
- Input:
- Expected Output:
12 - Justification: The maximum rectangular area is formed by the bars of heights
5,4,5, which is equal to4x3=12. This rectangle spans from the third to the sixth bar.
Solution
To solve this problem, the key approach is to utilize a stack to keep track of bars that are potentially part of the largest rectangle. We traverse each bar in the histogram and use the stack to maintain bars in ascending order of height. When we encounter a bar that is shorter than the bar at the top of the stack, it indicates the end of a potentially largest rectangle involving the top-of-stack bar. By calculating the area of the rectangle with the stack's top bar as the smallest bar and comparing it with the maximum area found so far, we ensure that we find the largest rectangle.
This method is effective because it allows us to dynamically adjust to the changing potential for the largest rectangle as we iterate through the bars. It combines the efficiency of a single pass through the data with the ability to backtrack and calculate areas as soon as we know a rectangle's bounds. This blend of forward-looking and immediate calculation ensures we efficiently find the largest possible rectangle.
Step-by-step Algorithm
- Initialize an empty stack to keep track of the indices of bars.
- Iterate through each bar in the histogram.
- While the stack is not empty and the current bar's height is less than the height of the bar at the top of the stack:
- Pop the top of the stack. Let this be
topIndex. - Calculate the area of the rectangle using the height of the popped bar. If the stack is empty, the width is the current index
i; otherwise, it'si - stack.peek() - 1. - Update the maximum area if necessary.
- Pop the top of the stack. Let this be
- Push the current index onto the stack.
- While the stack is not empty and the current bar's height is less than the height of the bar at the top of the stack:
- Return the maximum area found.
Algorithm Walkthrough
Let's consider the input [6,2,5,4,5,1,6]:
- Step 1: Start with an empty stack and
maxArea = 0. - Step 2: Iterate through each bar's height:
- At index 0 (
height=6):- Push 0 onto the stack.
maxArearemains0.
- At index 1 (
height=2):- Since
6 > 2, pop index 0 from the stack. Calculate area:6 * (1 - 0) = 6. UpdatemaxAreato6. - Push index 1 onto the stack.
- Since
- At index 2 (
height=5):- Push index 2 onto the stack since
2 < 5.maxArearemains6.
- Push index 2 onto the stack since
- At index 3 (
height=4):- Since
5 > 4, pop index 2 from the stack. Calculate area:5 * (3 - 1 - 1) = 5.maxArearemains same. - Push index 3 onto the stack.
- Since
- At index 4 (
height=5):- Push index 4 onto the stack since
4 < 5.maxArearemains6.
- Push index 4 onto the stack since
- At index 5 (
height=1):- Since
5 > 1, pop index 4 from the stack. Calculate area:5 * (5 - 3 - 1) = 5.maxArearemains6. - Since
4 > 1, pop index 3 from the stack. Calculate area:4 * (5 - 1 - 1) = 12. UpdatemaxAreato12. - Since
2 > 1, pop index 1 from the stack. Calculate area:2 * (i) = 2 * (5) = 10.maxArearemains same12. - Push index 5 onto the stack.
- Since
- At index 6 (
height=6):- Since
1 < 6, push index 6 onto the stack.maxArearemains12.
- Since
- At index 0 (
- Final
maxAreais12.
Code
import java.util.Stack;
public class Solution {
// Method to calculate the largest rectangle area
public int largestRectangleArea(int[] heights) {
Stack<Integer> stack = new Stack<>(); // Stack to store indices of heights
int maxArea = 0; // Variable to store the maximum area
for (int i = 0; i <= heights.length; i++) { // Loop through the heights array
int h = (i == heights.length) ? 0 : heights[i]; // Set h to 0 if i exceeds array length
while (!stack.isEmpty() && h < heights[stack.peek()]) { // Check for previous heights higher than current
int height = heights[stack.pop()]; // Get the height of the popped element
int width = stack.isEmpty() ? i : i - 1 - stack.peek(); // Calculate width of rectangle
maxArea = Math.max(maxArea, height * width); // Update maxArea if current area is greater
}
stack.push(i); // Push the current index onto the stack
}
return maxArea; // Return the maximum area
}
public static void main(String[] args) {
Solution solution = new Solution(); // Create an instance of the Solution class
// Example 1
System.out.println(solution.largestRectangleArea(new int[] { 4, 2, 3, 2 }));
// Example 2
System.out.println(
solution.largestRectangleArea(new int[] { 1, 3, 4, 5, 2 })
);
// Example 3
System.out.println(
solution.largestRectangleArea(new int[] { 6, 2, 5, 4, 5, 1, 6 })
);
}
}
Complexity Analysis
Time Complexity
: The algorithm traverses the histogram (array of bar heights) exactly twice in the worst case. The first traversal is the main loop where each bar is examined once. The second traversal occurs implicitly through stack operations. This leads to the linear time complexity.
Space Complexity
: The space complexity is determined by the stack that is used to store indices of bars. In the worst-case scenario, all bars are pushed onto the stack, requiring a space proportional to the number of bars.
🤖 Don't fully get this? Learn it with Claude
Stuck on Largest Rectangle in Histogram? Open Claude, copy a block below, and it'll teach you this exact concept — visually and interactively.
Progressively stronger hints — you still solve it.
I'm working on the problem **Largest Rectangle in Histogram** (DSA). Give me a HINT LADDER: start with the tiniest nudge, then wait. Only reveal the next, stronger hint when I ask. Do NOT show the full solution unless I type 'show solution'. Keep me doing the thinking. If you're unsure or a claim isn't standard, say so and reason from first principles instead of guessing.
See the technique, not just code.
Explain the optimal approach to **Largest Rectangle in Histogram** with a VISUAL walkthrough: trace it on a small concrete example using ASCII art / a step-by-step diagram, narrate what changes each step, then give time & space complexity with a one-line derivation. If you're unsure or a claim isn't standard, say so and reason from first principles instead of guessing.
Catch bugs, edge cases, sub-optimality.
I'll paste my solution to **Largest Rectangle in Histogram**. Review it for correctness, missed edge cases, and time/space complexity, then coach me toward the optimal — don't just rewrite it. Ask me to paste my code now. If you're unsure or a claim isn't standard, say so and reason from first principles instead of guessing.
Lock in recognition with look-alikes.
Give me 2 problems that use the SAME underlying pattern as **Largest Rectangle in Histogram**. For each, let me attempt first, then review my answer and name the trigger signal that reveals the pattern. If you're unsure or a claim isn't standard, say so and reason from first principles instead of guessing.