85. 最大矩形

85. 最大矩形

给定一个仅包含 01 、大小为 rows x cols 的二维二进制矩阵,找出只包含 1 的最大矩形,并返回其面积。

示例 1:

img

输入:matrix = [["1","0","1","0","0"],["1","0","1","1","1"],["1","1","1","1","1"],["1","0","0","1","0"]]
输出:6
解释:最大矩形如上图所示。

示例 2:

输入:matrix = []
输出:0

示例 3:

输入:matrix = [["0"]]
输出:0

示例 4:

输入:matrix = [["1"]]
输出:1

示例 5:

输入:matrix = [["0","0"]]
输出:0

提示:

  • rows == matrix.length
  • cols == matrix[0].length
  • 1 <= row, cols <= 200
  • matrix[i][j]'0''1'

思路:

​ 可以划为84题求出柱状图中的最大矩形面积,只要把上一层的柱子长度传到下一层即可

class Solution {
public:
    int ans=0;
    int maximalRectangle(vector<vector<char>>& matrix) {
        if(matrix.size()==0)return 0;
        int m=matrix.size();
        int n=matrix[0].size();
        vector<int>heights(n,0);//化为84题柱状图的情况
        for(int i=0;i<m;i++){
            for(int j=0;j<n;j++){
                if(matrix[i][j]=='0')heights[j]=0;
                else heights[j]+=1;
            }
            //对每层调用求柱状图求最大矩阵面积的函数
            ans=max(ans,largestRectangleArea(heights));
        }
        return ans;
    }
    //84题的方法
    int largestRectangleArea(vector<int>heights){
        int res=0;
        stack<int>st;//栈 记录下标
        //左右放入高度为0的柱子最后就不必去计算栈不为空的情况
        heights.insert(heights.begin(), 0);
        heights.push_back(0);
        //寻找左右都小于自己的第一个数 使用单调栈
        for(int i=0;i<heights.size();i++){
            while(!st.empty()&&heights[st.top()]>heights[i]){//找到比自己小的数
                int cur=st.top();
                st.pop();
                int left=st.top()+1;
                int right=i-1;
                res=max( res ,( right-left + 1) * heights[ cur ]);
            }
            st.push(i);//保证每个节点都入栈过
        }
        return res;
    }
};
posted @ 2022-05-26 09:47  BailanZ  阅读(90)  评论(0编辑  收藏  举报