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

posted @ 2021-12-12 23:35  Rogn  阅读(93)  评论(0编辑  收藏  举报