求最大子矩阵的大小(Maximal Rectangle)

来源:互联网 发布:淘宝自然堂是正品吗 编辑:程序博客网 时间:2024/05/29 08:30

题目:

Given a 2D binary matrix filled with 0's and 1's, find the largest rectangle containing only 1's and return its area.For example, given the following matrix:1 0 1 0 01 0 1 1 11 1 1 1 11 0 0 1 0Return 6.

基本思想:

依次以矩阵每一行j为底,往j-1结算每一列有多少个连续的1,将结果存在一个数组height[j]。例如以矩阵第三行[1,1,1,1,1]往1,2行结算,可得height[j]={3,1,3,2,2}。对于每次结算得到height[j]数组,我们可以将其看成一个直方图。如[3,1,3,2,2]可以看成如下直方图:

这里写图片描述

然后我们依次求出可以这个height[j]数组中最大矩形的大小maxArea是多少,依次更新这个maxArea,就可以得到结果。

如何求height[j]数组的最大矩形大小

求数组最大矩形大小,我们是利用一个单调栈来实现的。单调栈顾名思义就是栈的元素从栈底到栈顶依次是递增或递减的。利用单调递增栈我们可以求出数组中每一个元素左边离它最近比它小的位置和右边离它最近比它小的位置在哪里。例如对于数组{3,1,3,2,2}对于第一个元素左边离它最近比它小的位置为空,右边离它最近比它小的位置在哪里为1。如何利用单调递增栈实现上述过程呢?在将数组元素压入栈时需要遵循下面的规则:

  1. 如果当前栈stack为空或者当前数组的元素height[j]>=height[stack.top()](栈顶元素),那么直接把当前元素的位置j压入stack。
  2. 如果当前栈不为空且当前数组元素height[j]<=height[stack.top()](栈顶元素),那么依次从stack弹出元素,并结算栈顶元素为根基,向左和向右分别可以拓展到哪里,则可以得出当前最大子矩阵的大小为多少。

结算最大矩阵大小思想如下:

如何当前遍历的元素的元素为i,当前栈顶元素元素为j,弹出栈顶元素后,新的栈顶元素为k。那么现在考虑以元素为j为根基,其向左最左能达到k+1,因为j最左最近小于j的元素应该为k,那么向右最远应该能到i-1,因为j之所以被弹出,就是因为遇到了第一个比位置j值小的位置。所以其最大子矩阵大小结算为(i-k-1)*height[j].

综上,得到代码如下:

class Solution {public:    int maximalRectangle(vector<vector<char>>& matrix) {        if(matrix.empty()||matrix[0].empty())            return 0;        int row=matrix.size();        int col=matrix[0].size();        int maxArea=0;        vector<int> height(col+1,0);        for(int i=0;i<row;++i){            stack<int> stack;            for(int j=0;j<col+1;++j){                if(j<col){                    height[j]=(matrix[i][j]-'0')==0?0:height[j]+1;//得到height数组                }                if(stack.empty()||height[j]>=height[stack.top()]){//规则1                    stack.push(j);                }else{                    while(!stack.empty()&&height[stack.top()]>=height[j]){//规则2                        int top=stack.top();                        stack.pop();                        int curArea=height[top]*(stack.empty()?j:j-stack.top()-1);                        maxArea=maxArea>curArea?maxArea:curArea;                    }                }                stack.push(j);            }        }        return maxArea;    }};
阅读全文
0 0
原创粉丝点击