当前位置:网站首页>leetcode 85.最大矩形 单调栈应用
leetcode 85.最大矩形 单调栈应用
2022-08-10 19:06:00 【Alkali!】
题目描述
最大矩形
给定一个仅包含 0 0 0 和 1 1 1 、大小为 r o w s × c o l s rows \times cols rows×cols 的二维二进制矩阵,找出只包含 1 1 1 的最大矩形,并返回其面积。
思路
这题要从柱状图中最大的矩形中得到思路
- 从矩阵中找出直方图,那么就能通过计算直方图中的最大矩形面积来计算矩阵中的最大矩形面积
- 将矩阵中上下相邻的值为1的格子看成直方图中的柱子
以如下的矩阵为例:
可以按行为基线,划分成四个84题中的柱状图。
这样,求矩阵中面积最大的全1矩形,即是求这所有转化而来的柱状图中最大的矩形面积。
思路:
- 把矩阵的每行看作柱状图,先由原矩阵得到表示柱状图的序列
- 对每行调用84题中的函数,求答案的最大值即可
代码
class Solution {
public:
int maximalRectangle(vector<vector<char>>& matrix) {
if(matrix.size()==0||matrix[0].size()==0) return 0;
int num=0;
for(int i=0;i<matrix.size();i++)
for(int j=0;j<matrix[0].size();j++)
if(matrix[i][j]=='1')
num++;
if(num==0) return 0;
//以上为特殊值判断处理
//一定要给二维的vector开辟空间,不然后面不能直接用下标访问
vector<vector<int> > count(matrix.size());
for(int i=0;i<matrix.size();i++)
count[i].resize(matrix[0].size());
//把矩阵的每行看作柱状图,先由原矩阵得到表示柱状图的序列
for(int i=0;i<matrix.size();i++)
for(int j=0;j<matrix[0].size();j++)
if(i==0)
count[i][j]=matrix[i][j]-'0';
else
{
if(matrix[i][j]=='1')
{
if(matrix[i-1][j]=='1')
count[i][j]=count[i-1][j]+1;
else
count[i][j]=1;
}
else
count[i][j]=0;
}
//调用84题的函数,求最大值
int res=-1;
for(int i=0;i<matrix.size();i++)
res=max(res,largestRectangleArea(count[i]));
return res;
}
int largestRectangleArea(vector<int>& heights) {
vector<int> left,right;
stack<pair<int,int>> s;
for(int i=0;i<heights.size();i++)
{
while(!s.empty()&&s.top().second>=heights[i])
s.pop();
if(s.empty())
left.push_back(-1);
else
left.push_back(s.top().first);
s.push({
i,heights[i]});
}
while(!s.empty()) s.pop();
for(int i=heights.size()-1;i>=0;i--)
{
while(!s.empty()&&s.top().second>=heights[i])
s.pop();
if(s.empty())
right.push_back(heights.size());
else
right.push_back(s.top().first);
s.push({
i,heights[i]});
}
reverse(right.begin(),right.end());
int res=0;
for(int i=0;i<heights.size();i++)
res=max(res,(right[i]-left[i]-1)*heights[i]);
return res;
}
};
边栏推荐
- QoS服务质量七交换机拥塞管理
- QoS服务质量六路由器拥塞管理
- [教你做小游戏] 只用几行原生JS,写一个函数,播放音效、播放BGM、切换BGM
- 怎么完全卸载赛门铁克_Symantec卸载方法,赛门铁克卸载「建议收藏」
- TDD、FDD是什么意思?
- ARouter使用自定义注解处理器,自动生成跳转Activity的代码,避免手动填写和管理path
- 3D Game Modeling Learning Route
- 多功能纳米酶Ag/PANI|柔性衬底纳米ZnO酶|铑片纳米酶|Ag-Rh合金纳米颗粒纳米酶|铱钌合金/氧化铱仿生纳米酶
- QoS Quality of Service Eight Congestion Avoidance
- RS-485多主机通信的组网方式评估
猜你喜欢
随机推荐
mysql 中大小写问题
RS-485多主机通信的组网方式评估
【CNN】刷SOTA的trick
QoS服务质量八拥塞避免
哈工大软件构造Lab3(2022)
优化是一种习惯●出发点是'站在靠近临界'的地方
IIC通信协议总结[通俗易懂]
多功能纳米酶Ag/PANI|柔性衬底纳米ZnO酶|铑片纳米酶|Ag-Rh合金纳米颗粒纳米酶|铱钌合金/氧化铱仿生纳米酶
网络虚拟化
史上最全GIS相关软件(CAD、FME、Arcgis、ArcgisPro)
【luogu CF1534F2】Falling Sand (Hard Version)(性质)(dfs)(线段树 / 单调队列 / 贪心)
2022杭电多校七 Black Magic (签到)
Pt/CeO2单原子纳米酶|[email protected] NPs纳米酶|碳纳米管负载铂颗粒纳米酶|白血病拮抗多肽修饰的FeOPtPEG复合纳米酶
『牛客|每日一题』岛屿数量
LeetCode·283.移除零·双指针
Redis persistence mechanism
含有PEG 间隔基和一个末端伯胺基团(CAS:1006592-62-6)化学试剂
子域名收集&Google搜索引擎语法
FEMRL: A Framework for Large-Scale Privacy-Preserving Linkage of Patients’ Electronic Health Rec论文总结
3D游戏建模学习路线









