代码随想录算法训练营第六十天|84.柱状图中最大的矩形

代码随想录 (programmercarl.com)

84.柱状图中最大的矩形

方法一:暴力解法

寻找每个柱子左边和右边第一个比他矮的,确定宽度,高度,最终得出面积

超时了,时间复杂度是O(n^2)。

方法二:双指针法

时间复杂度是O(n)

方法三:单调栈法

寻找元素第一个比他大或比他小的元素,都可以使用单调栈的思路

接雨水求的是右边第一个比他大的元素====递增的单调栈

而本题求的是右边第一个比他小的元素====递减的单调栈

注意:需要在 height数组前后各加一个元素0

left:表示矩形左边第一个比他小的数字;right:表示矩形右边第一个比他小的数组

矩形面积s = (right - left - 1) * w;

class Solution {
    public int largestRectangleArea(int[] heights) {
        int[] newHeight = new int[heights.length + 2];
        System.arraycopy(heights, 0, newHeight, 1, heights.length);
        //该函数意义:public static void arraycopy(Object src,
        //                             int srcPos,
        //                             Object dest,
        //                             int destPos,
        //                             int length)
        //src:源数组;	srcPos:源数组要复制的起始位置;
        //dest:目的数组;	destPos:目的数组放置的起始位置;	length:复制的长度。
        //注意:src and dest都必须是同类型或者可以进行转换类型的数组.
        newHeight[heights.length + 1] = 0;
        newHeight[0] = 0;
        //给原数组首尾加0
        int res = 0;

        Stack<Integer> stack = new Stack<>();
        stack.push(0);

        for (int i = 1; i < newHeight.length; i++) {
            while (newHeight[i] < newHeight[stack.peek()]){
                //因为首尾加了0,所以栈不可能为空,省略判断
                int mid = stack.peek();
                stack.pop();
                int h = newHeight[mid];
                int left = stack.peek();
                int right = i;
                int w = right - left - 1;
                res = Math.max(res, h * w);
            }
            stack.push(i);
        }
        return res;
    }
}

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-01-11 22:50:01       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-01-11 22:50:01       101 阅读
  3. 在Django里面运行非项目文件

    2024-01-11 22:50:01       82 阅读
  4. Python语言-面向对象

    2024-01-11 22:50:01       91 阅读

热门阅读

  1. Sqlite3相关返回值

    2024-01-11 22:50:01       46 阅读
  2. springboot 集成kafka

    2024-01-11 22:50:01       58 阅读
  3. springboot常见注解

    2024-01-11 22:50:01       62 阅读
  4. GO语言Context的作用

    2024-01-11 22:50:01       43 阅读
  5. 回溯算法part01 算法

    2024-01-11 22:50:01       59 阅读
  6. C++中ios::in, ios::out, ios::trunc使用

    2024-01-11 22:50:01       58 阅读
  7. How to build a localized sdkman mirror service

    2024-01-11 22:50:01       37 阅读
  8. Hive基础知识(三):Linux系统下的MySQL安装

    2024-01-11 22:50:01       57 阅读
  9. Python图形界面开发:Tkinter与PyQt

    2024-01-11 22:50:01       58 阅读
  10. Eva.js是什么(互动小游戏开发)

    2024-01-11 22:50:01       66 阅读