给定 n 个非负整数,用来表示柱状图中各个柱子的高度。每个柱子彼此相邻,且宽度为 1 。
求在该柱状图中,能够勾勒出来的矩形的最大面积。
示例 1:
输入:heights = [2,1,5,6,2,3] 输出:10 解释:最大的矩形为图中红色区域,面积为 10
示例 2:
输入: heights = [2,4] 输出: 4
代码思想:
- 进栈前弹出的都是左边比自己大的→确定左边界;
- 出栈时必定是右边第一次遇到比自己小的→确定右边界
class Solution { public: int largestRectangleArea(vector<int>& heights) { // 维护一个单调递增栈,用于存储索引 stack<int> st; // 在数组头部插入一个高度为0的柱子,防止原数组为单调递减 heights.insert(heights.begin(), 0); // 在数组尾部插入一个高度为0的柱子,防止原数组为单调递增 heights.push_back(0); // 初始化最大矩形面积为0 int maxValue = 0; // 遍历整个高度数组 for (int i = 0; i < heights.size(); i++) { // 当当前柱子高度小于栈顶柱子高度时,计算以栈顶柱子为高度的最大矩形面积 while (!st.empty() && heights[i] < heights[st.top()]) { int mid = st.top(); // 栈顶元素的索引 st.pop(); // 弹出栈顶元素 if (!st.empty()) { int left = st.top(); // 左边界是栈新的栈顶元素 int right = i; // 右边界是当前柱子的索引 int w = right - left - 1; // 矩形宽度 int h = heights[mid]; // 矩形高度 maxValue = max(maxValue, w * h); // 更新最大矩形面积 } } // 当前柱子索引入栈 st.push(i); } // 返回最大矩形面积 return maxValue; } };
标签:heights,柱子,int,st,柱状图,矩形,单调 From: https://www.cnblogs.com/yueshengd/p/18650077