LeetCode Day63

45 阅读1分钟

84. 柱状图中最大的矩形

给定 n 个非负整数,用来表示柱状图中各个柱子的高度。每个柱子彼此相邻,且宽度为 1 。 求在该柱状图中,能够勾勒出来的矩形的最大面积。

示例 1: 输入:heights = [2,1,5,6,2,3] 输出:10 解释:最大的矩形为图中红色区域,面积为 10 示例 2: 输入: heights = [2,4] 输出: 4

思路

  1. 如果当前条形的高度大于栈顶条形的高度,我们将它的索引压入栈中。
  2. 否则,我们一直从栈中弹出条形,直到栈顶的条形的高度小于当前条形的高度。每次我们弹出一个条形时,我们计算以该条形为高度的最大矩形的面积,这是因为我们知道,当前栈中的所有条形的高度都大于栈顶条形的高度。
  3. 面积计算为:弹出条形的高度 *(当前索引 - 弹出后的栈顶索引 - 1)。如果栈为空,则宽度为当前索引。
  4. 最后,我们将当前条形的索引压入栈中。
  5. 在遍历完成后,我们将栈中剩余的条形都弹出,并计算面积,就像在遍历过程中一样。

题解

#include <vector>
#include <stack>

class Solution {
public:
    int largestRectangleArea(vector<int>& heights) {
        int max_area = 0;
        stack<int> indices;

        for (int i = 0; i <= heights.size(); ++i) {
            // 我们在最后添加一个高度为0的条形,以确保所有实际的条形都被处理。
            int height = (i == heights.size()) ? 0 : heights[i];
            
            while (!indices.empty() && heights[indices.top()] > height) {
                int popped_index = indices.top();
                indices.pop();
                int width = indices.empty() ? i : i - indices.top() - 1;
                max_area = max(max_area, heights[popped_index] * width);
            }
            
            indices.push(i);
        }

        return max_area;
    }
};