码迷,mamicode.com
首页 > 其他好文 > 详细

leetcode 85 最大矩形

时间:2020-03-11 18:14:37      阅读:51      评论:0      收藏:0      [点我收藏+]

标签:vector   rectangle   矩形   图片   amp   i++   pre   curl   turn   

题意:

技术图片

 

 题解:

我们知道最大矩形一定是由矩形中某个点向上延伸直到为‘0’,然后往左右延伸(在高度得到保证的情况下左右伸展)的矩形

因此我们通过遍历每一行来求取对于以每个点来说的最大矩形并获得最大值

这里最关键的一点就是当遍历到某一个点的上面的那个点为‘0’,此时该点的左右延伸长度不在与上一行进行比较,而实从本行重新开始,

这里十分精妙,具体体现在程序中的当该点为‘0’时 l[j]=0和 r[j]=n,通过这一赋值可以避免下一行的左右延伸长度与上一行进行比较。

class Solution {
public:
    int maximalRectangle(vector<vector<char>>& matrix) {
        int m=matrix.size();
        if(m==0)
            return 0;
        int n=matrix[0].size();
        int area=0;
        vector<int> l(n,0);
        vector<int> r(n,n);
        vector<int> h(n,0);
        for(int i=0;i<m;i++)
        {
            int curl=0,curr=n;
            for(int j=0;j<n;j++)
            {
                if(matrix[i][j]==0)
                {
                    curl=j+1;
                    l[j]=0;
                }
                else
                {
                    l[j]=max(l[j],curl);
                }
            }
            for(int j=n-1;j>=0;j--)
            {
                if(matrix[i][j]==0)
                {
                    curr=j;
                    r[j]=n;
                }
                else
                {
                    r[j]=min(r[j],curr);
                }
            }
            for(int j=0;j<n;j++)
            {
                if(matrix[i][j]==1)
                {
                    h[j]=h[j]+1;
                    area=max(area,h[j]*(r[j]-l[j]));
                }
                else
                {
                    h[j]=0;
                }
            }
        }
        return area;
    }
};

 

leetcode 85 最大矩形

标签:vector   rectangle   矩形   图片   amp   i++   pre   curl   turn   

原文地址:https://www.cnblogs.com/QingFengDaHui/p/12464027.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!