LeetCode 84 : Largest Rectangle in Histogram

253 阅读1分钟
/**
 * 84. Largest Rectangle in Histogram
 * 1. Time:O(n)  Space:O(n)
 * 2. Time:O(n)  Space:O(n)
 */

// 1. Time:O(n)  Space:O(n)
class Solution {
    public int largestRectangleArea(int[] heights) {
        Stack<Integer> s = new Stack<>();
        int res = 0;
        int i = 0;
        while(i<=heights.length){
            int val = i<heights.length?heights[i]:0;
            if(s.isEmpty()||val>heights[s.peek()])
                s.push(i++);
            else{
                int tmp = s.pop();
                res = Math.max(res,heights[tmp]*(s.isEmpty()? i:i-s.peek()-1));
            }
        }
        return res;
    }
}

// 2. Time:O(n)  Space:O(n);
class Solution {
    public int largestRectangleArea(int[] heights) {
        if(heights==null || heights.length==0) return 0;
        int[] left = new int[heights.length];
        int[] right = new int[heights.length];
        left[0] = -1;
        right[heights.length-1] = heights.length;
        for(int i=1;i<heights.length;i++){
            int p = i-1;
            while(p>=0 && heights[p]>=heights[i])
                p = left[p];
            left[i] = p;
        }
        for(int i=heights.length-2;i>=0;i--){
            int p = i+1;
            while(p<heights.length && heights[p]>=heights[i])
                p = right[p];
            right[i] = p;
        }
        int maxArea = 0;
        for(int i=0;i<heights.length;i++)
            maxArea = Math.max(maxArea,heights[i]*(right[i]-left[i]-1));
        return maxArea;
    }
}