今天的题很值得思考并且值得动手把程序码一遍。
今天这题解法比较多
但我用了单调栈
将问题转化为了前几天写过的一道题进行求解。
85. 最大矩形
(1)题目描述
85. 最大矩形
https://leetcode.cn/problems/maximal-rectangle/description/
给定一个仅包含 0
和 1
、大小为 rows x cols
的二维二进制矩阵,找出只包含 1
的最大矩形,并返回其面积。
示例 1:
输入:matrix = [["1","0","1","0","0"],["1","0","1","1","1"],["1","1","1","1","1"],["1","0","0","1","0"]] 输出:6 解释:最大矩形如上图所示。
示例 2:
输入:matrix = [] 输出:0
示例 3:
输入:matrix = [["0"]] 输出:0
示例 4:
输入:matrix = [["1"]] 输出:1
示例 5:
输入:matrix = [["0","0"]] 输出:0
提示:
rows == matrix.length
cols == matrix[0].length
1 <= row, cols <= 200
matrix[i][j]
为'0'
或'1'
做题分析:
用自己的话解释题意:
给你一个二维的由字符‘0’‘1’构成的矩阵,在这其中找到一个全部为‘1’的最大矩阵的面积。
开始思考解决方法:
刚开始看到这道题的时候
讲真的,我的第一时间是想到了动态规划。
但是后来一直没找到合适的这题的状态转移
换个思路思考:
因为我们找的是这个图形里的矩阵的面积
我们其实可以想到前几天有一道题:84.柱状图中最大的矩形
这道题就是在给定的柱状图里找到能组成的最大的面积。
那两道题的不同点在于:
我们今天做的题是一个矩阵,并且每一行的情况都不一样
那这个不同点促成了什么呢
该题的柱形,不一定靠着底部!!!!
那我们针对于这个思路继续针对性的求解:
如何解决我们的柱形不靠着底部呢?
那我们就针对性的把每一行都当一次底!
那其实这道题就基本解决了
解决思路是这样的:
我们针对于每一行都当一次水平面
然后将其水平面上的柱状图的高度保存下来
用单调栈进行求解每一行的柱状图最大面积即可。
如果单调栈的用法有些疑虑的话,可以看一看我之前的84题的题解(知乎)
那我接下来讲一下我写的过程中出现的错误
希望可以帮助到大家:
1、这个矩阵不是N*N的,不是!不是!不是!(我刚开始没看清一直错误)
2、每次算完一行之后,栈一定要清空!清空!清空!!!(没清空的话会可能导致自己的单调栈的数组出问题)
(调试问题的注释我就不删了,大家也可以试试)
代码如下:
class Solution {
public:
int maximalRectangle(vector<vector<char>>& matrix) {
int rows=matrix.size(),cols=matrix[0].size();
int height[cols],ans=0,right_min[cols],left_min[cols];
stack<int>l;
stack<int>r;
for(int i=0;i<cols;i++)height[i]=0;
for(int i=0;i<rows;i++){
stack<int>().swap(l);
stack<int>().swap(r);//*****stack栈必须要初始化,否则可能遗留
for(int j=0;j<cols;j++){
if(matrix[i][j]=='1'){
height[j]+=1;
}
else height[j]=0;
}
for(int j=0;j<cols;j++){
right_min[j]=cols;
while(!r.empty()&&height[r.top()]>height[j]){
right_min[r.top()]=j;
r.pop();
}
r.push(j);
}
for(int j=cols-1;j>=0;j--){
left_min[j]=-1;
while(!l.empty()&&height[l.top()]>height[j]){
left_min[l.top()]=j;
l.pop();
}
l.push(j);
}
for(int j=0;j<cols;j++){
//cout<<height[j]<<" ";
//cout<<left_min[j]<<","<<right_min[j]<<"="<<(right_min[j]-left_min[j]-1)*height[j]<<" ";
ans=max(ans,(right_min[j]-left_min[j]-1)*height[j]);
} /**/
//cout<<endl;
}
return ans;
}
};
二、总结及计划
今天能够独立写出来这道题
感觉不错的
继续继续。
难度上来了。