leetcode84最大矩形&&leetcode最大01矩阵
leetcode84最大矩形
分析:单调栈,维护一个单调递增栈,小于等于出栈,每次出栈时说明以出栈元素作为枚举值,i为右边界栈顶元素的下一个为左边界。为了使栈中元素都起作用,需要末尾补个0.
class Solution {
public:
int largestRectangleArea(vector<int>& heights) {
stack<int>st;
heights.push_back(0); //
int res = 0;
for(int i=0;i<heights.size();i++) {
while(!st.empty() && heights[st.top()]>heights[i]) {
// res[st.top()] = i; // 弹出的时候赋值
// 对于pos来说,左边第一个小于自身的是i, 右边第一个小于自身的是st.top() , pop之后的top
int pos = st.top();st.pop();
int left = st.empty() ? -1 : st.top();
int right = i;
res = max(res, (right-left-1)*heights[pos]);
}
st.push(i);
}
return res;
}
};
leetcode最大01矩阵
分析:这次终于看懂了
就是枚举每一行,以每一行为底,每个元素的高度就是连续1的个数。对每一行调用上面求最大矩形的函数。
class Solution {
public:
int largestRectangleArea(vector<int>& heights) {
if(heights.size() == 0) return 0;
int ans = 0;
stack<int>s;
heights.push_back(0); // 确报最后一个方块被考虑到
for(int i = 0;i < heights.size();i++)
{
while(!s.empty() && heights[i] <= heights[s.top()])
{
int pos = s.top();s.pop();
ans = max(ans, heights[pos] * (s.empty() ? i : i-1-s.top()));
}
s.push(i);
}
return ans;
}
int maximalRectangle(vector<vector<char>>& matrix) {
if(matrix.size() == 0) return 0;
int n = matrix.size(), m = matrix[0].size();
vector<int>height(m, 0);
int ans = 0;
for(int i = 0;i < n;i++)
{
for(int j = 0;j < m;j++) // 得到高度
{
if(matrix[i][j] == '1') height[j] += 1;
else height[j] = 0;
}
ans = max(ans, largestRectangleArea(height)); // 每一行调用依次求“最大矩形”函数
}
return ans;
}
};
参考链接:
1. https://leetcode-cn.com/problems/largest-rectangle-in-histogram/comments/176448
2. https://leetcode-cn.com/problems/maximal-rectangle/comments/80595
原编辑时间 2020-05-03 19:02
个性签名:时间会解决一切