For example, Given height = [2,1,5,6,2,3], return 10.
分析:使用一个栈的O(n)解法,代码非常简洁,栈内存储的是高度递增的下标。对于每一个直方图高度,分两种情况。1:当栈空或者当前高度大于栈顶下标所指示的高度时,
当前下标入栈。否则,2:当前栈顶出栈,并且用这个下标所指示的高度计算面积。而这个方法为什么只需要一个栈呢?因为当第二种情况时,for循环的循环下标回退,
也就让下一次for循环比较当前高度与新的栈顶下标所指示的高度,注意此时的栈顶已经改变由于之前的出栈。
实现代码:
/**
* @Title: MaxRecragle.java
* @Package stack
* @Description: TODO
* @author peidong
* @date 2017-5-3 上午9:29:07
* @version V1.0
*/
package stack;
import java.util.Stack;
public class MaxRecragle {
/**
*
* @Title: largestRectangleArea
* @Description: 利用栈求矩形最大面积
* @param @param height
* @param @return
* @return int
* @throws
*/
public static int largestRectangleArea(int[] height){
//面积初始化
int area = 0;
//初始化栈
Stack<Integer> stack = new Stack<Integer>();
for(int i = 0; i< height.length; i++){
if(stack.empty() || height[stack.peek()] < height[i]){
stack.push(i);
}else{
int start = stack.pop();
int width = stack.empty()?i:i - stack.peek() -1;
area = Math.max(area, height[start]*width);
i--;
}
}
while(!stack.empty()){
int start = stack.pop();
int width = stack.empty()?height.length:height.length - stack.peek() -1;
area = Math.max(area, height[start]*width);
}
return area;
}
/**
* @Title: main
* @Description: TODO
* @param @param args
* @return void
* @throws
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
int[] array = {2, 1, 5, 6, 2, 3};
int area = largestRectangleArea(array);
System.out.println("最大的矩形面积是:"+area);
}
}