zoukankan      html  css  js  c++  java
  • LeetCode:Largest 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.

    For example,
    Given height = [2,1,5,6,2,3],
    return 10.                                                                                                        本文地址

    分析:最暴力的方法就是枚举所有区间的最大矩形值,然后选择最大的。可以通过分别枚举区间右边界和区间左边界,时间复杂度O(n^2)这样做大数据会超时。枚举的过程中可以优化一下:可以很容易理解,如果height[i+1] > height[i] 那么区间[k…i]内的最大矩形肯定不会超过区间[k…i+1]内的最大矩形,比如上例中的区间[0…3]内的矩形要大于[0…2]内的矩形,因为height[3] > height[2]。因此我们在枚举区间右边界时,只选择那些height上升区间的最大值处作为右边界(比如例子中的2 、6 、3)。优化后可以通过leetcode的大数据,虽然做了优化,但是时间复杂度还是O(n^2),代码如下:

    class Solution {
    public:
        int largestRectangleArea(vector &height) {
            // IMPORTANT: Please reset any member data you declared, as
            // the same Solution instance will be reused for each test case.
            int len = height.size(),res = 0;
            int rBorder = 0; //每次选择递增序列的最大值作为右边界
            while(rBorder < len)
            {
                if(rBorder + 1 < len && height[rBorder+1] >= height[rBorder])rBorder++;
                else
                {//找到了右边界
                    int minVal = height[rBorder];
                    //枚举左边界
                    for(int lBorder = rBorder; lBorder >= 0; lBorder--)
                    {
                        if(minVal > height[lBorder])
                            minVal = height[lBorder];
                        int tmpArea = minVal * (rBorder - lBorder + 1);
                        if(res < tmpArea)res = tmpArea;
                    }
                    rBorder++;
                }
            }
            return res;
        }
    };

    网上找到了一种O(n)的解法,非常巧妙,通过栈来维护height数组中递增的索引,具体可以参考这篇博客,这里只贴上代码:

    class Solution {
    public:
        int largestRectangleArea(vector<int> &height) {
            // IMPORTANT: Please reset any member data you declared, as
            // the same Solution instance will be reused for each test case.
            height.push_back(0);//数组末尾插入dummy元素0
            int len = height.size(),res = 0;
            stack<int> S;//注意栈内保存的是数组height的下标索引
            for (int i = 0; i < len; i++) 
            {
                 if (S.empty() || height[i] > height[S.top()]) S.push(i);
                 else 
                 {
                     int tmp = S.top();
                     S.pop();
                     res = max(res, height[tmp] * (S.empty() ? i : i-S.top()-1));
                     i--;
                 }
            }
            height.pop_back();//删除dummy
            return res;
        }
    };

    【版权声明】转载请注明出处:http://www.cnblogs.com/TenosDoIt/p/3454634.html

  • 相关阅读:
    Asp.NET 4.0 ajax实例DataView 模板编程1
    ASP.NET 4.0 Ajax 实例DataView模板编程 DEMO 下载
    部分东北话、北京话
    .NET 培训课程解析(一)
    ASP.NET 4.0 Ajax 实例DataView模板编程2
    ASP.NET Web Game 架构设计1服务器基本结构
    ASP.NET Web Game 构架设计2数据库设计
    TFS2008 基本安装
    Linux上Oracle 11g安装步骤图解
    plsql developer远程连接oracle数据库
  • 原文地址:https://www.cnblogs.com/TenosDoIt/p/3454634.html
Copyright © 2011-2022 走看看