【代码随想录二刷】day 60 | 84.柱状图中最大的矩形

二刷主要记录理解不一样的题

一刷地址:day60

今日题目:中等

遍历以i为高度,我们只要找到左右第一个比自己小的元素

class Solution {
    // 求左右第一个比自己小的
    public int largestRectangleArea(int[] h) {
        int n = h.length;       
        int[] l = new int[n];  // 左边第一个比自己小的,默认-1
        int[] r = new int[n];  // 右边第一个比自己大的,默认n
        Arrays.fill(l, -1);
        Arrays.fill(r, n);
        Deque<Integer> st = new ArrayDeque<>();

        // 右边 左 -> 右
        for(int i = 0; i < n; i++){
            while(!st.isEmpty() && h[st.peek()] > h[i]) {
                int idx = st.poll();
                r[idx] = i;
            }
            st.push(i);
        }

        // 清空st
        st.clear();

        // 左边  右 -> 左
        for(int i = n-1; i >=0; i--){
            while(!st.isEmpty() && h[st.peek()] > h[i]){
                int idx = st.poll();
                l[idx] = i;
            }
            st.push(i);
        }

        int ans = 0;
        for(int i = 0; i < n; i++){
            int t = h[i];
            int a = l[i];
            int b = r[i];
            ans = Math.max(ans, (b-a-1) * t);
        }

        return ans;
    }
}

你可能感兴趣的:(代码随想录二刷,算法,leetcode,数据结构,java)