Created
March 1, 2014 09:14
-
-
Save wayetan/9287369 to your computer and use it in GitHub Desktop.
Largest Rectangle in Histogram
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| /** | |
| * Given n non-negative integers representing the histogram's bar height where the width of each bar is 1, find the area of largest rectangle in the histogram. | |
| * Above is a histogram where width of each bar is 1, given height = [2,1,5,6,2,3]. | |
| * The largest rectangle is shown in the shaded area, which has area = 10 unit. | |
| * For example, | |
| * Given height = [2,1,5,6,2,3], | |
| * return 10. | |
| */ | |
| public class Solution { | |
| public int largestRectangleArea(int[] height) { | |
| Stack<Integer> s = new Stack<Integer>(); | |
| if(height == null || height.length == 0) | |
| return 0; | |
| // Initialize max area | |
| int max_area = 0; | |
| int i = 0; | |
| // run through all bars of given histogram | |
| while(i < height.length) { | |
| // If current bar is higher than the bar of the stack peek, push it to stack. | |
| if(s.empty() || height[s.peek()] <= height[i]) | |
| s.push(i++); | |
| else { | |
| // if current bar is lower than the stack peek, calculate area of rectangle with stack top as the smallest bar. | |
| // 'i' is 'right index' for the top and element before top in stack is 'left index' | |
| int top = s.pop(); | |
| // calculate the area with height[top] stack as smallest bar and update max_area if needed | |
| max_area = Math.max(max_area, height[top] * (s.empty() ? i : i - s.peek() - 1)); | |
| } | |
| } | |
| // Now pop the remaining bars from stack and calculate area with every popped bar as the smallest bar. | |
| while(!s.isEmpty()) { | |
| int top = s.pop(); | |
| max_area = Math.max(max_area, height[top] * (s.empty() ? i : i - s.peek() - 1)); | |
| } | |
| return max_area; | |
| } | |
| } |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment