原题链接:84. 柱状图中最大的矩形
solution:
暴力做法,每次找到i左右两边第一个小于height[i]的位置计算面积(TLE)
时间复杂度: O(n^2)
class Solution {
public:
int largestRectangleArea(vector<int>& heights) {
int n = heights.size();
int res = 0;
for(int i = n - 1;i >= 0;i--) {
int j = i,k = i;
while(j - 1 >= 0 && heights[j - 1] >= heights[i]) j--;
while(k + 1 < n && heights[k + 1] >= heights[i]) k++;
res = max(res,(k - j + 1) * heights[i]);
}
return res;
}
};
利用单调栈:求解优化heights[i]左边和右边第一个小于heights[i]的位置,这样就可以计算出矩形的宽度
时间复杂度:O(n)
class Solution {
public:
int largestRectangleArea(vector<int>& heights) {
int n = heights.size();
vector<int> left(n, 0);
vector<int> right(n, 0);
stack<int> stk;
for(int i = 0;i < n;i++) {
while(!stk.empty() && heights[stk.top()] >= heights[i]) stk.pop();
if(stk.empty()) left[i] = -1;
else left[i] = stk.top();
stk.push(i);
}
stk = stack<int> (); //清空栈
for(int i = n - 1;i >= 0;i--) {
while(!stk.empty() && heights[stk.top()] >= heights[i]) stk.pop();
if(stk.empty()) right[i] = n;
else right[i] = stk.top();
stk.push(i);
}
int res = 0; //定义返回值
for(int i = 0;i < n;i++) {
res = max(res, (right[i] - left[i] - 1) * heights[i]);
}
return res;
}
};