【LeetCode】85. 最大矩形

题目:85. 最大矩形

85. 最大矩形


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

示例 1:
在这里插入图片描述

输入: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'

解题思路

思路

  • 将矩阵逐行叠加,形成一维数组
  • 根据求直方图最大矩形来求转换后的矩阵

步骤

  1. 矩阵压缩成数组:逐行叠加,遇到0为0;
  2. 求直方图最大矩形:
    1. 设置栈,数组L,R
    2. 遍历元素,
      1. 如果栈顶元素大于当前元素则弹出
      2. 栈空则L[i] = -1
      3. 不空则等于栈顶元素下标
      4. 当前元素入栈
    3. 逆向遍历
      1. 如果栈顶元素大于当前元素则弹出
      2. 栈空则R[i] = n
      3. 不空则等于栈顶元素下标
      4. 当前元素入栈
    4. 最大矩形为当前元素*LR之间距离。

代码

class Solution {
public:
// 1. 矩阵压缩成数组:逐行叠加,遇到0为0;
// 2. 求直方图最大矩形:
// 	1.  设置栈,数组L,R
// 	2. 遍历元素,
// 		1. 如果栈顶元素大于当前元素则弹出
// 		2. 栈空则`L[i] = -1`
// 		3. 不空则等于栈顶元素下标
// 		4. 当前元素入栈
// 	3. 逆向遍历
// 		1. 如果栈顶元素大于当前元素则弹出
// 		2. 栈空则`R[i] = n`
// 		3. 不空则等于栈顶元素下标
// 		4. 当前元素入栈
// 	4. 最大矩形为当前元素*LR之间距离。
    int getMax(vector<int> height) {
        int n = height.size();
        int res = 0;
        vector<int> L(n, 0), R(n, 0);
        stack<int> stack;
        
        for (int i = 0; i < n; i++) {
            while (!stack.empty() && height[stack.top()] >= height[i]) 
                stack.pop();
            if (stack.empty()) L[i] = -1;
            else L[i] = stack.top();
            stack.push(i);
        }
        while (!stack.empty()) stack.pop();

        for (int i = n - 1; i >= 0; i--) {
            while (!stack.empty() && height[stack.top()] >= height[i])
                stack.pop();
            if (stack.empty()) R[i] = n;
            else R[i] = stack.top();
            stack.push(i);
        }

        for (int i = 0; i < n; i++) {
            res = max(res, height[i] * (R[i] - L[i] - 1));
        }
        
        return res;

    }
    int maximalRectangle(vector<vector<char>>& matrix) {
        vector<int> height(matrix[0].size(),0);
        int res = 0;
        for (int i = 0; i < matrix.size(); i++){
            for (int j = 0; j < matrix[0].size(); j++){
                if (matrix[i][j] == '0') height[j] = 0;
                else height[j] += 1;
            }
            res = max(res, getMax(height));
        }
        return res;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ZhShy23

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值