85. 最大矩形

cpp 复制代码
class Solution {
public:
    int maximalRectangle(vector<vector<char>>& matrix) {
        int m=matrix.size();
        int n=matrix[0].size();
        vector<vector<int>> left(m, vector<int>(n,0));
        for(int i=0;i<m;i++){
            for(int j=0;j<n;j++){
                if(matrix[i][j] =='1')
                    left[i][j] = (j>=1?left[i][j-1]:0)+1;
            }
        }
        int area=0;
        int w,h;
        w=h=0;
        int res=0;
        for(int i=0;i<m;i++){
            for(int j=0;j<n;j++){
                if(left[i][j]){
                    w=left[i][j];
                    for(int k=i;k>=0;k--){
                       h=i-k+1;
                       w=min(w, left[k][j]);
                       res=max(res, w*h);
                    }
                }  
            }
        }
        return res;
    }
};

方法二:

求矩阵面积最大的就是用单调栈(公共模版),固定宽度,让高度尽可能大。

cpp 复制代码
class Solution {
public:
    int maximalRectangle(vector<vector<char>>& matrix) {
        int m=matrix.size();
        int n=matrix[0].size();
        vector<vector<int>> left(m, vector<int>(n,0));
        for(int i=0;i<m;i++){
            for(int j=0;j<n;j++){
                if(matrix[i][j] =='1')
                    left[i][j] = (j>=1?left[i][j-1]:0)+1;
            }
        }
        
        int area, w,h;
        area=0;
        for(int j=0;j<n;j++){
            vector<int> up(m,0);
            vector<int> down(m,0);
            stack<int> stk;
            for(int i=0;i<m;i++){
                while(stk.size()&&left[stk.top()][j]>=left[i][j])
                    stk.pop();
                up[i]=(stk.size()==0?-1:stk.top());
                stk.push(i);
            }
            stk=stack<int>();
            for(int i=m-1;i>=0;i--){
                while(stk.size()&&left[stk.top()][j]>=left[i][j])
                    stk.pop();
                down[i] = (stk.size()==0?m:stk.top());
                stk.push(i);
            }
            for(int i=0;i<m;i++){
                int height=down[i]-up[i]-1;
                int width=left[i][j];
                area = max(area, height*width);
            }
        }
        return area;

    }
};
相关推荐
努力努力再努力wz1 分钟前
【Lua 入门系列】Lua数据结构:从 Table 出发,一文串联数组、链表、栈、队列、集合、映射与树的实现原理
数据结构·链表·lua
dialect_8 小时前
KMP算法
开发语言·c++·算法
reikocao9 小时前
卡尔曼滤波的动态机制:P如何改变融合权重
算法
漂流瓶jz9 小时前
UVA-1612 猜名次 题解答案代码 算法竞赛入门经典第二版
数据结构·算法·题解·排序·aoapc·算法竞赛入门经典
吞下星星的少年·-·10 小时前
Div.2 CF 1130B题(构造,贪心)
算法·贪心·构造
文丑颜不良啊10 小时前
LeetCode1481~1500题目解析
java·leetcode
文丑颜不良啊11 小时前
LeetCode1381~1400题目解析
java·leetcode
是main不是漫11 小时前
【双指针——移动零】数组划分类题目的入门基石
c++·算法
深圳市快瞳科技有限公司12 小时前
野外鸟类AI识别落地实录:输入适配、结构化输出、去重聚合与置信度分流的工程实践
算法·计算机视觉·鸟类识别·鸟类ai识别·野外鸟类观测·林业调查
专注仿真14 小时前
梯度提升类(XFBoost)算法详解与代码实例
开发语言·人工智能·python·算法·大模型训练·控制算法