数组最大矩形面积

问题描述

给定数组arr,其中arr[i]表示1为底,高为arr[i]的矩形,则数组arr可以表示一个柱状图。

这里求该柱状图所包含的矩形中,面积最大的矩形。

例如:int arr[] = {2, 4, 7, 3, 5, 4, 6, 9, 4};

则该数组可表示如下的柱状图:

在该柱状图中,面积最大矩形是8 * 3 = 24;

代码如下

/** @brief
 * 求数组所表示柱状图中,面积最大的矩形
 *
 * @param arr[] int
 * @param len int
 * @return int
 *
 */
int MaxArea(int arr[], int len)
{
    stack<int> idxStack; // 存储下标,所对应元素为严格增序
    int ret = 0; // 返回结果
    int idx = 0; // 当前元素下标
    int pre = 0; // 当前元素向左可扩展的最远位置

    for(int i = 0; i < len; ++i)
    {
        if(idxStack.empty() || arr[idxStack.top()] < arr[i])
        {
            idxStack.push(i);
        }
        else // 出栈
        {
            while(!idxStack.empty() && arr[idxStack.top()] >= arr[i])
            {
                idx = idxStack.top();
                idxStack.pop();

                /**< 对于元素arr[idx],向左右两端扩展的范围是[pre, i) */
                pre = idxStack.empty() ? 0 : idxStack.top() + 1;
                ret = max(ret, (i - pre) * arr[idx]);
            }

            idxStack.push(i); // 右边界入栈
        }
    }

    /**< 若栈中仍然含有元素,则认为其范围是[pre, len). 此时全部出栈 */
    while(!idxStack.empty())
    {
        idx = idxStack.top();
        idxStack.pop();

        pre = idxStack.empty() ? 0 : idxStack.top() + 1;
        ret = max(ret, (len - pre) * arr[idx]);
    }

    return ret;
}
时间: 2024-10-03 23:06:56

数组最大矩形面积的相关文章

HDU 1542 Atlantis (求矩形面积并)

Atlantis Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Description There are several ancient Greek texts that contain descriptions of the fabled island Atlantis. Some of these texts even include maps of parts of

Poj 2559 Largest Rectangle in a Histogram(柱形统计图中的最大矩形面积)

 给出一个柱形统计图中,求其中的最大矩形面积 做完这道题,搜了一下题解大部分基本都是单调栈......然而做之前并不知道这是什么,其实用递推也可以做这道题,理解起来比较容易. 用两个数组l,r记录当前坐标可以向左和向右延伸的最远位置的坐标,然后就是递推了. 初始时将l[i],r[i]的值置为i,即自己的坐标.这里拿l[i]举例: 从左向右扫描统计图,计算当前位置的l[i]时,如果h[i] > h[ l[i] - 1 ]的话,那么l[i] = l[ l[i]-1  ]. 然后对于每个位置,an

2015年百度之星初赛(1) --- F 矩形面积

矩形面积 Problem Description 小度熊有一个桌面,小度熊剪了很多矩形放在桌面上,小度熊想知道能把这些矩形包围起来的面积最小的矩形的面积是多少. Input 第一行一个正整数 T,代表测试数据组数($1 \leq T \leq 20$),接下来 T 组测试数据. 每组测试数据占若干行,第一行一个正整数 $N(1 \leq N < \leq 1000)$,代表矩形的数量.接下来 N 行,每行 8 个整数$x_1, y_1, x_2, y_2, x_3, y_3, x_4, y_4$

解题报告:LeetCode Largest Rectangle in Histogram(计算最大矩形面积)

题目出处:https://leetcode.com/problems/largest-rectangle-in-histogram/题意描述:给定n个非负的整数,代表n个依次相邻的宽度为1的柱形的高,求这些柱形所能形成的最大的矩形面积. 解决思路:此题最直接最原始的做法就是扫描起点和终点,并随时更新最大面积,但是这样的做法的复杂度为O(n^2),显然会超时,这里就不再贴代码了. 于是我们需要考虑怎么将复杂度降下来,一种想法是在求面积之前进行预处理,将每个整数左右的第一个比当前位置矮的柱形的下标l

Leetcode:Largest Rectangle in Histogram 最大矩形面积

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 heigh

直方图中最大矩形面积

注意:本文并未对原文完整翻译,而是结合原文并根据本人理解写出,因此部分内容为完整翻译,部分内容为个人理解所写. Largest Rectangle in Histogram 直方图中最大矩形面积 一个直方图是由许多矩形组成,在给定的直方图中找出最大的矩形面积.为了简化问题,假定所有矩形宽度都为1个单位. 例如,下面的直方图中有7个矩形,高度分别是(6,2,5,4,5,2,6).最大的矩形面积是12(如下图所示,最大矩形面积用红色方框标出) 下面给出的解决方法时间复杂度为O(n).矩形面积的计算公

【HDU 1542】Atlantis 矩形面积并(线段树,扫描法)

[题目] Atlantis Problem Description There are several ancient Greek texts that contain descriptions of the fabled island Atlantis. Some of these texts even include maps of parts of the island. But unfortunately, these maps describe different regions of

POJ&#183;1151 Atlantis&#183;线段树求矩形面积并

题目在这:http://poj.org/problem?id=1151 Atlantis Time Limit: 1000MS   Memory Limit: 10000K Description There are several ancient Greek texts that contain descriptions of the fabled island Atlantis. Some of these texts even include maps of parts of the is

POJ 1151 / HDU 1542 Atlantis 线段树求矩形面积并

题意:给出矩形两对角点坐标,求矩形面积并. 解法:线段树+离散化. 每加入一个矩形,将两个y值加入yy数组以待离散化,将左边界cover值置为1,右边界置为2,离散后建立的线段树其实是以y值建的树,线段树维护两个值:cover和len,cover表示该线段区间目前被覆盖的线段数目,len表示当前已覆盖的线段长度(化为离散前的真值),每次加入一条线段,将其y_low,y_high之间的区间染上line[i].cover,再以tree[1].len乘以接下来的线段的x坐标减去当前x坐标,即计算了一部