leetcode_084 Largest Rectangle in Histogram

题目分析:

  • 求条形图中最大矩形的面积,输入为条形图中条的个数和每个条的高度。

解题思路:

  • 双重循环(超时)

    找第i个条左边和右边连续的不低于条的个数,然会计算面积,从而得最后结果

  • 利用栈的思想求解

    计算第i个条件图对应的矩形面积,需要知道它连续的左边有多少个条的高度不低于它,假设有a个;同时需要知道它右边多少个连续的条的高度不低于它,假设有b个,此时第i条对应的最大矩形面积为 hi * (a + b + 1)。

  • 实现程序

    class Solution
    {
        public:
            //方法1:双重循环进行求解(超时) 
            int largestRectangleArea1(vector<int> &height)
            {
                int max_area = 0;
                for (int i = 0; i < height.size(); i++)
                {
                    int t = height[i];
                    int j = i - 1;
                    int k = i + 1;
                    int temp_area = height[i];
                    // 找前面连续的不低于height[i]的位置 
                    while (j >= 0)
                    {
                        if (height[j] >= height[i])
                        {
                            temp_area += height[i];
                            j--;
                        }
                        else
                            break;
                    }
                    // 找后面连续的不低于height[i]的位置 
                    while (k <= height.size() - 1)
                    {
                        if (height[k] >= height[i])
                        {
                            temp_area += height[i];
                            k++;
                        }
                        else
                            break;
                    }
                    if (max_area < temp_area)
                    {
                        max_area = temp_area; 
                    }
                }
                return max_area;
            }
            // 计算最大值函数 
            int Max(int a, int b)
            {
                return a > b ? a : b;
            }
            // 方法2:利用栈进行求解 
            int largestRectangleArea(vector<int> &height)
            {
                height.push_back(0);
                // 记录当前第i位置对应连续不低于height[i]的最前位置 
                stack<int> stack; 
                int i = 0;
                int maxArea = 0;
                while (i < height.size())
                {
                    // 当栈为空,或栈中元素位置的高度低于当前高度,更行第i位置对应的前面连续不低于height[i]的位置,不进行计算面积 
                    // 只要连续递增,就一直进栈 
                    if (stack.empty() || height[stack.top()] <= height[i])
                    {
                        // 次数当前位置进栈,同时i移动位置 
                        stack.push(i++);
                    }
                    else   // 计算面积 
                    {
                        int t = stack.top();   // 取出栈顶元素 
                        stack.pop();
                        // 计算面积,并更新最大面积 
                        maxArea = Max(maxArea, height[t] * (stack.empty() ? i : i - stack.top() - 1));
                    }
                }
                return maxArea;
            }
    };
    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值