力扣85、最大矩形

难度:困难

 该题思路为,将二维的数组转变为一维的,进行降维计算:

        定义一个heights[]数组来存储每一行中的数据,如果在这一行中遇到了matrix[i][j]为1的话,heights[j]++,否则的话,将heights[j]置为0。

        然后再将每一行的heights数组传入一个函数,对该行所形成的数组所组成的最大矩形进行一个保存到ans中,经过每一行的对比之后,经常max函数的筛选,就可以得到该二维数组中“1”所形成的矩形的最大值!

 如上图所示,那么这道题就变成了:力扣84、柱形图中最大的矩形

经过降维之后,就变得简单了:

class Solution {
public:
    int maximalRectangle(vector<vector<char>>& matrix) 
    {
        int m = matrix.size();  //matrix行列
        int n = matrix[0].size(); 
        vector<int> heights(n);
        int ans = 0;
        for (int i = 0; i < m; ++i)
        {
            for (int j = 0; j < n; ++j)
            {
                if (matrix[i][j] == '1')
                {
                    heights[j]++;
                }
                else
                {
                    heights[j] = 0;
                }
            }
            ans = max(ans, maxArea(heights));   //将每一行遍历的结果传入maxArea函数中
        }
        return ans;
    }
    int maxArea(vector<int>& heights)
    {
        stack<int> stack;   //stack只保存下标i
        int ans = 0;
        heights.push_back(-1);  //保证heights的右边界
        for (int i = 0; i < heights.size(); ++i)
        {
            while (!stack.empty() && heights[stack.top()] > heights[i])
            {
                int idx = stack.top();
                stack.pop();
                int left = stack.empty() ? -1 : stack.top();
                ans = max(ans, (i - left - 1) * heights[idx]);
            }
            stack.push(i);
        }
        heights.pop_back();  //将heights末端插入的-1 pop出去
        return ans;
    }
};

思路取自于b站一位up主:【LeetCode 每日一题】85. 最大矩形 | 手写图解版思路 + 代码讲解_哔哩哔哩_bilibili

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值