求最大子矩阵的大小(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。如何利用单调递增栈实现上述过程呢?在将数组元素压入栈时需要遵循下面的规则:
- 如果当前栈stack为空或者当前数组的元素
height[j]>=height[stack.top()](栈顶元素)
,那么直接把当前元素的位置j压入stack。 - 如果当前栈不为空且当前数组元素
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
- 求最大子矩阵的大小 (maximal-rectangle)
- 求最大子矩阵的大小(Maximal Rectangle)
- Maximal Rectangle (求矩阵的最大的子矩阵) 【面试算法leetcode】
- 寻找01矩阵中最大的子矩阵 Maximal Rectangle
- (每日算法)Leetcode --- Maximal Rectangle(最大子矩阵)
- LeetCode 85. Maximal Rectangle(最大子矩阵)
- leetcode 85. Maximal Rectangle 最大子矩阵
- Maximal Rectangle(最大矩阵)
- 求最大子矩阵的大小 + 栈
- 求最大子矩阵的大小
- 求最大子矩阵的大小
- leetcode 85. Maximal Rectangle(最大全1子矩阵)
- 求全是1的最大矩阵面积 Maximal Rectangle @LeetCode
- Maximal Square 求最大全为1的子矩阵(leeCode)
- 栈和队列---求最大子矩阵的大小
- 求最大子矩阵的大小——C++实现
- Maximal Rectangle 最大的矩形
- HDU 1506 Largest Rectangle in a Histogram(dp求最大子矩阵和)
- 移动端布局字体单位的选择之px、rem和em揭秘
- Operation not permitted
- hdu-1159 裸LCS
- 运行javac -encoding utf-8 **.java 同样报错”编码 GBK 的不可映射字符“
- Lsn5研究ListView源码来封装RecylerView实现添加无数个头布局和尾布局
- 求最大子矩阵的大小(Maximal Rectangle)
- 深入理解HTTP协议
- FZU2253 Salty Fish
- python数据类型之number
- dyld: Library not loaded: /usr/local/opt/readline/lib/libreadline.6.dylib
- 错排公式,n封信放入n个信封,要求全部放错
- 利用AD13设计PCB的问题总结1-10
- Java绑定
- Handle/Body pattern(Wrapper pattern)