代码随想录算法训练营 day 60: ● 84.柱状图中最大的矩形 ● 总结

75 阅读1分钟

跟接雨水差不多,但单调栈是从大到小。 而且需要在首尾加入一个最低的0方便出栈计算,否则可能遍历完毕后无法出栈。

class Solution {
    public int largestRectangleArea(int[] heights) {
        Deque<Integer> stk = new LinkedList<Integer>();

        int[] newh = new int[heights.length + 2];
        newh[0] = 0;
        for(int i=0; i<heights.length; i++) {
            newh[i+1] = heights[i];
        }
        newh[newh.length - 1] = 0;

        int res = 0;
        stk.push(0);

        for(int i=0; i<newh.length; i++) {
            if(newh[i] > newh[stk.peek()]) {
                stk.push(i);
            }
            else if (newh[i] == newh[stk.peek()]){
                stk.pop();
                stk.push(i);
            }
            else {
                while(newh[i] < newh[stk.peek()]) {
                    int mid = stk.peek();
                    stk.pop();

                    int left = stk.peek();
                    int right = i;
                    int h = newh[mid];
                    int w = right - left - 1;
                    res = Math.max(res, h * w);
                }

                stk.push(i);
            }
        }

        return res;
    }
}

完结总结: 按类型刷题确实比盲目刷要好, 对贪心和动规的理解比以前更好了一些。 还是需要复习和二刷。 第一次用java刷题,也算练练手,以前都是用c++