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;
        }
    
  • 相关阅读:
    739. Daily Temperatures
    535. Encode and Decode TinyURL
    811. Subdomain Visit Count
    706. Design HashMap
    C++-static作用(转)
    大学四年应当如何渡过(转)
    计算机导论第八章-总结
    计算机导论第四章习题
    计算机导论-第一章习题
    20世纪最伟大的十大算法
  • 原文地址:https://www.cnblogs.com/xym4869/p/12636512.html
Copyright © 2011-2022 走看看