LeetCode 刷题【84. 柱状图中最大的矩形】
84. 柱状图中最大的矩形
自己做
解:分割法(超时)
class Solution {
public://计算面积int cal_s(vector<int>& heights, int i, int j){if(i > j) //越界return -1;//更新最小边int min_h = (i + j) / 2; //尽量均分for(int z = i; z <= j; z++)if(heights[z] < heights[min_h])min_h = z;int max_s = (j - i + 1) * heights[min_h]; //当前最大面积int left_s = cal_s(heights, i, min_h - 1); //左边分割的面积int right_s = cal_s(heights, min_h + 1, j); //右边分割的面积return max(max_s, max(left_s, right_s));}int largestRectangleArea(vector<int>& heights) { return cal_s(heights, 0, (int)heights.size() - 1);}
};
看题解
解:左右扩散法(单调栈)
官方题解如下:
class Solution {
public:int largestRectangleArea(vector<int>& heights) {int n = heights.size();vector<int> left(n), right(n);stack<int> mono_stack;for (int i = 0; i < n; ++i) {while (!mono_stack.empty() && heights[mono_stack.top()] >= heights[i]) {mono_stack.pop();}left[i] = (mono_stack.empty() ? -1 : mono_stack.top());mono_stack.push(i);}mono_stack = stack<int>();for (int i = n - 1; i >= 0; --i) {while (!mono_stack.empty() && heights[mono_stack.top()] >= heights[i]) {mono_stack.pop();}right[i] = (mono_stack.empty() ? n : mono_stack.top());mono_stack.push(i);}int ans = 0;for (int i = 0; i < n; ++i) {ans = max(ans, (right[i] - left[i] - 1) * heights[i]);}return ans;}
};