当前位置:网站首页>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;
}
};
边栏推荐
- 电脑开不了机是什么原因?
- 小分子PEG CAS:1352814-07-3生物素-PEG6-丙酸叔丁酯
- Redis persistence mechanism
- 【C#】WCF和TCP消息通信练习,实现群聊功能
- [教你做小游戏] 斗地主的手牌,如何布局?看25万粉游戏区UP主怎么说
- keepalived:故障检测自动修复脚本
- FEMRL: A Framework for Large-Scale Privacy-Preserving Linkage of Patients’ Electronic Health Rec论文总结
- 赎金信问题答记
- 力扣18-四数之和——双指针法
- 【luogu CF1534F2】Falling Sand (Hard Version)(性质)(dfs)(线段树 / 单调队列 / 贪心)
猜你喜欢
RS-485多主机通信的组网方式评估
We used 48h to co-create a web game: Dice Crush, to participate in international competitions
Keras深度学习实战(17)——使用U-Net架构进行图像分割
QoS Quality of Service Eight Congestion Avoidance
常见端口及服务
[Natural Language Processing] [Vector Representation] PairSupCon: Pairwise Supervised Contrastive Learning for Sentence Representation
杭电多校七 1003-Counting Stickmen(组合数学)
Redis 持久化机制
DefaultSelectStrategy NIOEventLoop执行策略
“2022零信任神兽方阵”启动调研,欢迎各单位填报信息
随机推荐
第四届“传智杯”全国大学生IT技能大赛(初赛A组) 补题
LeetCode·283.移除零·双指针
3D Game Modeling Learning Route
关于npm/cnpm/npx/pnpm与yarn
【LeetCode】42、接雨水
TikTok选品有什么技巧?
The Biotin-PEG3-Br/acid/NHS ester/alcohol/amine collection that everyone wants to share
状态压缩dp蒙德里安的梦想
你不知道的浏览器页面渲染机制
史上最全GIS相关软件(CAD、FME、Arcgis、ArcgisPro)
905. 区间选点(贪心)
几行深度学习代码设计包含功能位点的候选免疫原、酶活性位点、蛋白结合蛋白、金属配位蛋白
Pt/CeO2单原子纳米酶|[email protected] NPs纳米酶|碳纳米管负载铂颗粒纳米酶|白血病拮抗多肽修饰的FeOPtPEG复合纳米酶
【自然语言处理】【向量表示】PairSupCon:用于句子表示的成对监督对比学习
QoS服务质量八拥塞避免
[Go WebSocket] Your first Go WebSocket server: echo server
测试/开发程序员值这么多钱么?“我“不会愿赌服输......
IIC通信协议总结[通俗易懂]
redis 事件
烟雾、空气质量、温湿度…自己徒手做个环境检测设备