84. Largest Rectangle in Histogram

題目截圖
public int largestRectangleArea2(int[] heights) {
    if (heights == null) {
        return 0;
    }
    ArrayList<Integer> list = wrapArray(heights);
    
    int maxArea = 0;
    Stack<Integer> stack = new Stack<>();
    stack.push(0);
    
    for (int i = 1; i < list.size(); i++) {
        while (list.get(stack.peek()) > list.get(i)) {
            int index = stack.pop();
            int currArea = (i - stack.peek() - 1) * list.get(index);
            maxArea = Math.max(maxArea, currArea);
        }
        stack.push(i);
    }
    
    return maxArea;
}

// wrap array with beginning and ending height 0
private ArrayList<Integer> wrapArray(int[] heights) {
    ArrayList<Integer> list = new ArrayList<>(heights.length + 2);
    list.add(0);
    for (int h: heights) {
        list.add(h);
    }
    list.add(0);
    return list;
}

這種 Wrapper 方式比較好理解題解思路,以及處理 Corner case。下面的題解思路同上面一致。

public int largestRectangleArea(int[] heights) {
    if (heights == null || heights.length == 0) {
        return 0;
    }
    int maxArea = 0;
    Stack<Integer> stack = new Stack<>();
    stack.push(0);
    
    for (int i = 1; i < heights.length; i++) {
        while (!stack.isEmpty() && heights[stack.peek()] > heights[i]) {
            int index = stack.pop();
            int leftBound = stack.isEmpty() ? -1 : stack.peek();
            int currArea = (i - leftBound - 1) * heights[index];
            maxArea = Math.max(maxArea, currArea);
        }
        stack.push(i);
    }
    
    // int rightBound = stack.peek() + 1;
    int rightBound = heights.length;    // the top element must be the last index of the array
    while (!stack.isEmpty()) {
        int index = stack.pop();
        int leftBound = stack.isEmpty() ? -1 : stack.peek();
        int currArea = (rightBound - leftBound - 1) * heights[index];
        maxArea = Math.max(maxArea, currArea);
    }
    
    return maxArea;
}

另一種類似寫法:

public int largestRectangleArea(int[] heights) {
    if (heights == null || heights.length == 0) {
        return 0;
    }
    int maxArea = 0;
    Stack<Integer> stack = new Stack<>();
    
    for (int i = 0; i <= heights.length; i++) {
        int h = (i == heights.length) ? 0 : heights[i];
        while (!stack.isEmpty() && heights[stack.peek()] > h) {
            int index = stack.pop();
            int leftBound = stack.isEmpty() ? -1 : stack.peek();
            int currArea = (i - leftBound - 1) * heights[index];
            maxArea = Math.max(maxArea, currArea);
        }
        stack.push(i);
    }
    
    return maxArea;
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容