《leetCode》:largestRectangleArea

题目

《leetCode》:largestRectangleArea_第1张图片

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 heights = [2,1,5,6,2,3],
return 10.

思路一:报超时错误

两层for循环遍历,即找出第i个柱子参与面积计算产生的最大值。

`public int largestRectangleArea(int[] heights) {
    if(heights==null||heights.length<1){
        return 0;
    }
    int len=heights.length;
    int largestArea=0;
    for(int i=0;i<len;i++){
        int h=heights[i];
        int area=0;
        for(int j=i;j<len;j++){
            if(heights[j]<h){//使得h一直是最小的
                h=heights[j];
            }
            area=(j-i+1)*h;
            largestArea=largestArea>area?largestArea:area;//更新
        }
    }       
    return largestArea;
}`

思路二

详细思路见这里:http://blog.csdn.net/doc_sgl/article/details/11805519

`public int largestRectangleArea(int[] heights) {
    if(heights==null||heights.length<1){
        return 0;
    }

    int len=heights.length;
    int i=0;
    Stack<Integer> s=new Stack<Integer>();
    int largestArea=0;
    while(i<=len){//当i=len时,用0作为dummy元素,作用:使它准备进栈的时候,前面的元素全部弹出
        int h=(i==len?0:heights[i]);
        if(s.isEmpty()||heights[s.peek()]<=h){//将当前元素进栈
            s.push(i);   
            i++;
        }
        else{
            int top=s.pop();
            int tempRes=heights[top]*(s.isEmpty()?i:i-s.peek()-1);
            largestArea=max(largestArea,tempRes);
        }
    }      
    return largestArea;
}

private int max(int a, int b) {     
    return a>b?a:b;
}`

你可能感兴趣的:(LeetCode,rectangle,area,Largest)