力扣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

### LeetCode 85C++ 解决方案 LeetCode85 题名为 **Maximal Rectangle**,其目标是在由 '0' 和 '1' 组成的二维字符网格中找到最大全为 '1' 的矩形面积。此问题可以通过动态规划和柱状图的最大矩形面积方法来解决。 以下是基于上述思路的一种高效解法: #### 动态规划与柱状图结合的方法 通过将每一行视为柱状图的高度数组,并利用单调栈计算每行对应的柱状图中的最大矩形面积,可以得到最终的结果[^5]。 ```cpp #include <vector> #include <string> #include <stack> using namespace std; class Solution { public: int maximalRectangle(vector<vector<char>>& matrix) { if (matrix.empty()) return 0; int m = matrix.size(); int n = matrix[0].size(); vector<int> height(n, 0); int maxArea = 0; for(int i = 0; i < m; ++i){ // 更新当前高度数组 for(int j = 0; j < n; ++j){ if(matrix[i][j] == '1') height[j]++; else height[j] = 0; } // 计算以当前行为底边的最大矩形面积 maxArea = max(maxArea, largestRectangleArea(height)); } return maxArea; } private: int largestRectangleArea(const vector<int>& heights) { stack<int> st; int maxA = 0; int n = heights.size(); for(int i = 0; i <= n; ++i){ while(!st.empty() && (i == n || heights[st.top()] >= heights[i])){ int h = heights[st.top()]; st.pop(); int w = st.empty() ? i : i - st.top() - 1; maxA = max(maxA, h * w); } st.push(i); } return maxA; } }; ``` #### 方法解析 1. 使用 `height` 数组记录每一列的高度,当遇到 '1' 则累加高度,否则重置为零。 2. 对于每一行调用辅助函数 `largestRectangleArea` 来计算对应柱状图的最大矩形面积。 3. 辅助函数采用单调栈的方式处理柱状图,时间复杂度为 O(N),其中 N 表示柱子的数量。 4. 整体算法的时间复杂度为 O(M*N),空间复杂度为 O(N)[^5]。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值