Largest Rectangle in Histogram leetcode java

题目

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.

Largest Rectangle in Histogram leetcode java

Above is a histogram where width of each bar is 1, given height = [2,1,5,6,2,3].

Largest Rectangle in Histogram leetcode java

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.

题解:

这道题自己是完全没想到用栈了。。

有个很完整很详细很好的讲解在这里: http://www.cnblogs.com/lichen782/p/leetcode_Largest_Rectangle_in_Histogram.html

我就不写了。贴一下上面提到的代码吧。

O(n^2)的:

 1 public int largestRectangleArea(int[] height) {
 2         // Start typing your Java solution below
 3         // DO NOT write main() function
 4         int[] min = new int[height.length];
 5         int maxArea = 0;
 6         for(int i = 0; i < height.length; i++){
 7             if(height[i] != 0 && maxArea/height[i] >= (height.length - i)) {
 8                 continue;
 9             }
             for(int j = i; j < height.length; j++){
                 if(i == j) min[j] = height[j];
                 else {
                     if(height[j] < min[j - 1]) {
                         min[j] = height[j];
                     }else min[j] = min[j-1];
                 }
                 int tentativeArea = min[j] * (j - i + 1);
                 if(tentativeArea > maxArea) {
                     maxArea = tentativeArea;
                 }
             }
         }
         return maxArea;
     }

O(n)的:

 1 public int largestRectangleArea2(int[] height) {
 2         Stack<Integer> stack = new Stack<Integer>();
 3         int i = 0;
 4         int maxArea = 0;
 5         int[] h = new int[height.length + 1];
 6         h = Arrays.copyOf(height, height.length + 1);
 7         while(i < h.length){
 8             if(stack.isEmpty() || h[stack.peek()] <= h[i]){
 9                 stack.push(i++);
             }else {
                 int t = stack.pop();
                 maxArea = Math.max(maxArea, h[t] * (stack.isEmpty() ? i : i - stack.peek() - 1));
             }
         }
         return maxArea;
     }
上一篇:应用于电力电子变压器的双向DC_DC变换器综述(学习笔记)


下一篇:【reidis中ruby模块版本老旧利用rvm来更新】