Skip to content

Largest Rectangular Area Histogram #308

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 3 commits into
base: master
Choose a base branch
from
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
62 changes: 62 additions & 0 deletions Algorithms/Largest_Rectangular_Area_Histogram.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
//Java program to find maximum rectangular area in linear time

import java.util.Stack;

public class RectArea_Histogram
{
static int getMaxArea(int hist[], int n)
{
// The stack holds indexes of hist[] array
Stack<Integer> s = new Stack<>();

int max_area = 0; // Initialize max area
int top; // To store top of stack
int area_with_top; // To store area with top bar as the smallest bar

int i = 0;
while (i < n)
{
// If this bar is higher than the bar on top stack, push it to stack
if (s.empty() || hist[s.peek()] <= hist[i])
s.push(i++);

// If this bar is lower than top of stack, then calculate area of rectangle
// with stack top as the smallest bar.
else
{
top = s.peek();
s.pop();

// Calculate the area with hist[tp] stack as smallest bar
area_with_top = hist[top] * (s.empty() ? i : i - s.peek() - 1);

// update max area, if needed
if (max_area < area_with_top)
max_area = area_with_top;
}
}

// Now pop the remaining bars from stack and calculate area with every
// popped bar as the smallest bar
while (s.empty() == false)
{
top = s.peek();
s.pop();
area_with_top = hist[top] * (s.empty() ? i : i - s.peek() - 1);

if (max_area < area_with_top)
max_area = area_with_top;
}

return max_area;

}


public static void main(String[] args)
{
int hist[] = { 6, 1, 7, 4, 5, 9, 2 };
System.out.println(getMaxArea(hist, hist.length));
}
}