给定 n 个非负整数,用来表示柱状图中各个柱子的高度。每个柱子彼此相邻,且宽度为 1 。
求在该柱状图中,能够勾勒出来的矩形的最大面积。
以上是柱状图的示例,其中每个柱子的宽度为 1,给定的高度为 [2,1,5,6,2,3]。
图中阴影部分为所能勾勒出的最大矩形面积,其面积为 10
个单位。
链接:https://leetcode-cn.com/problems/largest-rectangle-in-histogram
/*基本思路:先把能完全包含各个柱状图的矩形的最大面积求出来,然后求出其中最大值即可。
要求能包含这个柱状图的最大面积,只要找他左边和右边第一个比他高度小的位置这个范围就是宽度
用栈存储每一个高度
当第i个柱子进栈时,如果栈顶柱子(此处记作柱子A)的高度低于或等于第i个柱子,则第i个柱子进栈;
如果高于第i个柱子,则出栈,并计算以柱子A为高的矩形最大面积。
参考https://blog.csdn.net/Zolewit/article/details/88863970
*/
class Solution {
public:
int largestRectangleArea(vector<int>& heights) {
heights.push_back(0);
int maxArea = 0;
stack<int> st;
int i;
for(i=0;i<heights.size();i++)
{
while(!st.empty() && heights[i]<heights[st.top()])
{
int top = st.top();
st.pop();
maxArea = max(maxArea,heights[top]*(st.empty()?i:(i-st.top()-1)));
}
st.push(i);
}
return maxArea;
}
};
给定一个仅包含 0 和 1 的二维二进制矩阵,找出只包含 1 的最大矩形,并返回其面积。
链接:https://leetcode-cn.com/problems/maximal-rectangle/
/*基本思想:把问题转化为求柱形图的最大面积的问题(leetcode 84题),对于每一行,都构造出一个柱状图(matrix有n列就有n个柱子,每一行都有一个temp,每个temp都求一个最大面积),求一个最大的面积,m行中找最大
对于第i行的构造: 就是对于第j列,就是从当前的j开始到之前的到第0行的j中连续的1的个数(换句话说 matrix[i][j]=0,temp[j]=0,matrix[i][j]=1,temp[j]=从j的这个1开始向前的所有行的这一列和这个1连续的1的个数)
*/
class Solution {
public:
int maximalRectangle(vector<vector<char>>& matrix) {
int ret = 0;
if(matrix.empty()|| matrix[0].empty()){
return ret;
}
int m = matrix.size();
int n = matrix[0].size();
for(int i = 0; i < m; i++){
vector<int> temp(n, 0);
for(int j = 0; j < n; j++){
int r = i;
while(r>=0 && matrix[r][j] == '1'){
temp[j]++;
r--;
}
}
ret = max(ret, largestRectangleArea(temp));
}
return ret;
}
int largestRectangleArea(vector<int>& heights) {
heights.push_back(0);
int maxArea = 0;
stack<int> st;
int i;
for(i=0;i<heights.size();i++)
{
while(!st.empty() && heights[i]<heights[st.top()])
{
int top = st.top();
st.pop();
maxArea = max(maxArea,heights[top]*(st.empty()?i:(i-st.top()-1)));
}
st.push(i);
}
return maxArea;
}
};