zoukankan      html  css  js  c++  java
  • 数组最大矩形面积

    问题描述

    给定数组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;
    }
  • 相关阅读:
    MySQL之ORM
    MySQL之索引补充
    MySQL存储过程
    c primer plus 7编程练习
    c语言中统计单词数目程序
    c语言统计输入字符数及行数
    c语言中getchar()、putchar()函数例子
    c primer plus 6编程练习
    c语言 %c 一次输出多个字符 (特殊程序)
    c语言 复合赋值运算符的优先级低于算术运算符
  • 原文地址:https://www.cnblogs.com/fengkang1008/p/4859190.html
Copyright © 2011-2022 走看看