zoukankan      html  css  js  c++  java
  • LeetCode——柱状图中最大的矩形

    Q:给出n个数字,代表直方图的条高,直方图每一条的宽度为1,请计算直方图中最大矩形的面积

    上图是每条宽度为1, 高度 =[2,1,5,6,2,3].的直方图

    图中的阴影部分是该直方图中面积最大的矩形,面积为10个单位
    例如:
    给出的高度 =[2,1,5,6,2,3],
    返回10.

    A:遍历数组以当前值为高构建最大长方形。
    用堆栈计算每一块板能延伸到的左右边界
    对每一块板

    • 堆栈顶矮,这一块左边界确定,入栈
    • 堆栈顶高,堆栈顶右边界确定,出栈,计算面积
    • 入栈时左边界确定
    • 出栈时右边界确定
    • 堆栈里元素是递增的(内部保持升序)

    本质:中间的短板没有用!
    复杂度 O(n)

    public int largestRectangleArea(int[] height) {
            int n = height.length;
            int result = 0;
            Stack<Integer> s = new Stack<>();
            for (int i = 0; i < n; i++) {
                while (!s.empty() && height[s.peek()] >= height[i]) {
                    int index = s.pop();
                    int h = height[index];
                    int k = i - 1 - (s.empty() ? (-1) : s.peek());
                    result = Math.max(result, k * h);
                }
                s.push(i);
            }
            while (!s.empty()) {
                int index = s.pop();
                int h = height[index];
                int k = n - 1 - (s.empty() ? (-1) : s.peek());
                result = Math.max(result, k * h);
            }
            return result;
        }
    
  • 相关阅读:
    TCP发送窗口更新tcp_ack_update_window
    关于nginx
    通过导出表找导出函数
    导出表
    静态链接库、动态链接库
    数据目录
    扩大节、合并节
    新增一个节
    用程序在代码节空白处加代码
    节空白处添加代码
  • 原文地址:https://www.cnblogs.com/xym4869/p/12636512.html
Copyright © 2011-2022 走看看