数据结构Stack实例(二):求矩形最大面积

来源:互联网 发布:嵌入式与单片机的关系 编辑:程序博客网 时间:2024/03/29 04:29
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.

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);
}


}

0 0
原创粉丝点击