时间轴
时间轴
2026-03-18
init
单调栈
题目:
这个案例是经典单调栈的场景,仔细想这道题,无非也是找到最左边第一个低于自己的矩形,和最右边第一个低于自己的矩形,其实这是经典The Next Greater问题
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051 | 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);} |
