Cover image for leetcode热题100 P84 柱状图中的最大矩形

leetcode热题100 P84 柱状图中的最大矩形

字数 294
阅读
访客

时间轴

时间轴

2026-03-18

init

单调栈

题目:

这个案例是经典单调栈的场景,仔细想这道题,无非也是找到最左边第一个低于自己的矩形,和最右边第一个低于自己的矩形,其实这是经典The Next Greater问题

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051
#include <vector>#include <stack>using std::vector;using std::stack;class Solution {    public:        int largestRectangleArea(vector<int> &heights)        {                int i, n = heights.size(), max_area = 0;                vector<int> left(n, 0);                vector<int> right(n, n - 1);                stack<int> stk1, stk2;                for (i = 0; i < n; i++) {                        while (!stk1.empty() && heights[i] < heights[stk1.top()]) {                                right[stk1.top()] = i - 1; // 右边界                                stk1.pop();                        }                        stk1.push(i);                }                // while (!stk.empty()) {                //         right[stk.top()] = n - 1;                // }                for (i = n - 1; i >= 0; i--) {                        while (!stk2.empty() && heights[i] < heights[stk2.top()]) {                                left[stk2.top()] = i + 1; // 左边界                                stk2.pop();                        }                        stk2.push(i);                }                // while (!stk.empty()) {                //         left[stk.top()] = 0;                // }                for (i = 0; i < n; i++)                        max_area = std::max(max_area, (right[i] - left[i] + 1) * heights[i]);                return max_area;        }};int main(){        vector<int> heights = { 2, 1, 5, 6, 2, 3 };        Solution S;        S.largestRectangleArea(heights);}
评论加载中…