方法:双指针
class Solution {
public:
int largestRectangleArea(vector<int>& heights) {
int n = heights.size();
vector<int> lmin(n);
vector<int> rmin(n);
lmin[0] = -1;
for (int i = 1; i < n; ++i) {
int t = i - 1;
while (t >= 0 && heights[i] <= heights[t]) t = lmin[t];
lmin[i] = t;
}
rmin[n-1] = n;
for (int i = n - 2; i >= 0; --i) {
int t = i + 1;
while (t < n && heights[i] <= heights[t]) t = rmin[t];
rmin[i] = t;
}
int res = 0;
for (int i = 0; i < n; ++i) {
int w = rmin[i] - lmin[i] - 1;
int sum = w * heights[i];
res = max(res, sum);
}
return res;
}
};
$时间复杂度O(n),空间复杂度O(n)
方法:单调栈
class Solution {
public:
int largestRectangleArea(vector<int>& heights) {
stack<int> st;
heights.insert(heights.begin(), 0);
heights.push_back(0);
st.push(0);
int res = 0;
for (int i = 1; i < heights.size(); ++i) {
while (heights[i] < heights[st.top()]) {
int mid = st.top();
st.pop();
int w = i - st.top() - 1;
int h = heights[mid];
res = max(res, w * h);
}
st.push(i);
}
return res;
}
};
$时间复杂度O(n),空间复杂度O(n)
文章介绍了两种方法来找到柱状图中最大的矩形面积:一种是使用双指针,另一种是利用单调栈。两种方法的时间复杂度均为O(n),空间复杂度也为O(n)。在双指针方法中,分别计算每个柱子左侧最小高度和右侧最小高度;而在单调栈方法中,栈用于存储柱子索引,保持栈内柱子高度从大到小的顺序。
585

被折叠的 条评论
为什么被折叠?



