• Leetcode84. Large rectangle in histogram


    问题描述:

    Given n non-negative integers representing the histogram's bar height where the width of each bar is 1, find the area of largest rectangle in the histogram.


    Above is a histogram where width of each bar is 1, given height = [2,1,5,6,2,3].


    The largest rectangle is shown in the shaded area, which has area = 10 unit.

    Example:

    Input: [2,1,5,6,2,3]
    Output: 10

    思路:

    在柱状图中寻找可以组成的最大矩形。

    一开始没什么想法,首先是暴力破解方法:对每一个柱,从其当前遍历到数组最前,比较可以形成的最大的矩形,矩形高度受最低的柱限制。

    时间复杂度为O(n2)

    显然,这样绝对会超时。

    我们可以针对这种方法进行优化:对其剪枝,最大值只有可能出现在局部峰值及其以前构成的矩形,我们可以只遍历局部峰值之前的柱们,通过判断当前值与之后值得关系来判断当前值是否为局部峰值。

    代码:

    class Solution {
    public:
        int largestRectangleArea(vector<int>& heights) {
            int large = 0;
            int HSize = heights.size();
            for(int i = 0; i < HSize; i++){
                if(i < HSize-1 && heights[i] <= heights[i+1]){
                    continue;
                }
                int minH = heights[i];
                for(int j = i; j > -1; j--){
                    minH = min(minH, heights[j]);
                    int width = i - j + 1;
                    int cur = width * minH;
                    large = max(large, cur);
                }
            }
            return large;
        }
    };

    这样的时间复杂度仍然为O(n2)

    值得注意的一点是剪枝的限制:

    if(i < HSize-1 && heights[i] <= heights[i+1]){
                    continue;
                }

    注意等于号!

    不加等于号就超时了!血的教训_(:з」∠)_

    有大神还写出了O(n)的方法,让我去学习一下再来总结一波

    是利用了栈来存储一个递增序列,当栈顶元素比当前元素大时,弹出栈顶元素并计算可形成的最大矩形

    代码:

    int largestRectangleArea2(vector<int> &height){
        stack<int> stk;
        int res = 0;
        height.push_back(0);
        for(int i = 0; i < height.size(); i++){
            while(!stk.empty() && height[stk.top()] >= height[i]) {
                int cur = stk.top();
                stk.pop();
                res = max(res, height[cur] * (stk.empty() ? i : (i-stk.top() - 1)));
            }
            stk.push(i);
        }
        return res;
    }

    参考链接:

    http://www.cnblogs.com/lichen782/p/leetcode_Largest_Rectangle_in_Histogram.html

    http://www.cnblogs.com/grandyang/p/4322653.html

  • 相关阅读:
    Linux使用退格键时出现^H解决方法
    Linux centos7下php安装cphalcon扩展的方法
    Webstorm/Phpstorm中设置连接FTP,并快速进行文件比较,上传下载,同步等操作
    在Vmware中安装CentOS7
    php stomp.dll 下载地址
    WIN7 64位系统安装JDK并配置环境变量
    SVN如何将版本库url访问地址中的https改为http
    两个日期这间的间隔天数
    vi/vim 命令速查手册
    判断PC或mobile设备
  • 原文地址:https://www.cnblogs.com/yaoyudadudu/p/9075053.html
Copyright © 2020-2023  润新知