[C++] LeetCode 85. 最大矩形

题目

给定一个填充了 0 和 1 的二进制矩阵,找到最大的只包含 1 的矩形并返回其面积。
例如,给出以下矩阵:
这里写图片描述
返回6

题解

这道题可以参考LeetCode 84. 柱状图中最大的矩形,这道题,那么这里每一行维持一个数组,记录当前矩阵的高度,然后就可以采用84. 柱状图中最大的矩形的方法计算出当前层最大面积,逐层下去,就可以得出最大值
84. 柱状图中最大的矩形求解过程可以参考84. 柱状图中最大的矩形

代码

class Solution {
public:
    int maximalRectangle(vector<vector<char>>& matrix) {
        if(matrix.size()==0||matrix[0].size()==0) return 0;
        int n=matrix.size(),m=matrix[0].size();
        vector<int> height(m,0);
        int res=0;
        for(int i=0;i<n;i++){
            stack<int> area;
            for(int j=0;j<m;j++){
                if(matrix[i][j]=='0') height[j]=0;
                else height[j]+=1;
                if(area.empty()||height[j]>height[area.top()]) area.push(j);
                else{
                    while(!area.empty()&&height[area.top()]>=height[j]){
                        int tmp=area.top();
                        area.pop();
                        int length=0;
                        if(area.empty()) length=j;
                        else length=j-area.top()-1;
                        res=max(res,height[tmp]*length);
                    }
                    area.push(j);
                }
            }
            while(!area.empty()){
                int tmp=area.top();
                area.pop();
                int length=0;
                if(area.empty()) length=m;
                else length=m-area.top()-1;
                res=max(res,height[tmp]*length);
            }
        }
        return res;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值