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;

    }
};
相关推荐
aramae6 小时前
MySQL复合查询(8)
java·c语言·开发语言·后端·算法
荆棘鸟智能7 小时前
城市感知设备怎么统一接入?从多协议网关到设备模型的中间件架构设计
人工智能·算法·边缘计算
淡海水8 小时前
13-04-面试-源码级深度追问链
数据结构·unity·面试·c#·游戏引擎·源码·il2cpp
Logic1018 小时前
C语言/数据结构位运算题解:异或XOR找出时尚聚会中的“独特颜色“——只出现一次的数字
c语言·数据结构·数组·位运算·时间复杂度·算法题·异或性质
INGNIGHT11 小时前
270 · 电话号码的字母组合II(Trie)
linux·算法
2401_8390805411 小时前
C++常见八股
数据结构·c++·算法
青山是哪个青山12 小时前
LeetCode 188:买卖股票的最佳时机 IV
算法
暮雨封夕12 小时前
跳表(Skip List)详解:原理、实现、使用场景与实际应用
数据结构
mikuyyds12 小时前
geo-toolbox 插件算法解析:RUSLE 与 MUSLE 的工程化落地
算法·rust·gis
Tisfy12 小时前
LeetCode 3498.字符串的反转度:一次遍历
leetcode·字符串·题解·遍历