85. 最大矩形

要求:给定一个仅包含 0 和 1 、大小为 rows x cols 的二维二进制矩阵,找出只包含 1 的最大矩形,并返回其面积。
思路:
法一:暴力,会超时。首先算出每个点左边的1(含点本身)的数量,然后以每个点为矩形右下角,枚举其高度即可
法二:单调栈。对每一列应用单调栈,当作84题

class Solution {
public:
    int maximalRectangle(vector<vector<char>>& matrix) {
        if (matrix.empty()) return 0;

        vector<int> heights(matrix[0].size(), 0);
        int maxArea = 0;

        for (vector<char>& row : matrix)
        {
            for (int i = 0; i < row.size(); ++ i)
            {
                if (row[i] == '0') heights[i] = 0;  //当前格子为0,则它所在的柱子高度为0
                else heights[i] ++ ;                //格子为1,则它的高度为上一行同位置高度+1
            }
            
            //每遍历完一行,就计算以这行为基线的直方图最大面积
            maxArea = max(maxArea, largestRectangleArea(heights));
        }

        return maxArea;
    }

    //使用单调栈求直方图最大矩形面积的方法
    int largestRectangleArea(vector<int>& heights) {
        stack<int> stk;
        stk.push(-1);

        int maxArea = 0;
        for (int i = 0; i < heights.size(); ++ i)
        {
            while (stk.top() != -1 && heights[stk.top()] > heights[i])
            {
                int height = heights[stk.top()];
                stk.pop();
                int width = i - stk.top() - 1;
                maxArea = max(maxArea, height * width);
            }

            stk.push(i);
        }

        while (stk.top() != -1)
        {
            int height = heights[stk.top()];
            stk.pop();
            int width = heights.size() - stk.top() - 1;
            maxArea = max(maxArea, height * width);
        }

        return maxArea;
    }
};

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值