问题描述:

  84:直方图最大面积。

  85:0,1矩阵最大全1子矩阵面积。

  

问题分析:

  对于84,如果高度递增的话,那么OK没有问题,不断添加到栈里,最后一起算面积(当然,面积等于高度h * disPos,这里的高度取决于两个h的较小者,那么如果有序的话,只需要计算每一个最小值h,在用到当前位置与最小值h所在位置的差值,也就是柱子数目,就OK了)。如果新h[i]的高度比之前的高度小的话,那么就可以认为之前所有比h[i]高的柱子都需要计算一下面积,然后对于破坏递增规则的h[i]会继续加入栈中。为甚会酱婶儿呢,因为你想哈,如果h[i]是最大矩形的右边界那么h[i + 1]是不一定有:h[i]>h[i+ 1]。哎呀,不用想了,肯定是对的 ,如果h[i]<h[i+ 1],那我直接用i+1的柱子当右边界的话,面积肯定会更大的嘛!没错,这就是我们为什么会用一个数据结构来说维护一个递增的序列来求解问题的原因。

  对于85,我说可以把他转换成84的求解形式,你信不信啊?不信的话,请看:

对于下面这个矩阵:

1 0 1 1 1
1 1 1 1 1
1 0 1 1 0
1 1 1 1 1

  我们用一个数组height[]来计算当前row下,每一column之前row(i -> 0)有多少个连续的1。

row 0: 1 0 1 1 1

row 1: 2 1 2 2 2

row 2: 3 0 3 3 0

row 3: 4 1 4 4 1

  我们对于每一行 row 来说,这个数字不就是表示的是当横轴在row处,直方图的高度吗!神奇,这样我们对于每一行都执行84中的算法,是不是就可以得到全局面积最大值了。

问题解决:

  实现上使用stack来维护递增height,没有问题的。这里提前将原来的数组height压入了0,使得最后一定会使stack中的数弹出来。如果不压入,那么最后记得check一下stack也是可以的。

代码如下:

class Solution {
public:
int maximalRectangle(vector<vector<char>>& matrix) {
if(matrix.size() == ) return ;
int n = matrix.size(), m = matrix[].size();
stack<int>sta;
int maxArea = ;
vector<int>height(m + , );
for(int i = ; i < n; i ++){
for(int j = ; j < m; j ++){
if(matrix[i][j] == '')
height[j] ++;
else
height[j] = ;
}
while(!sta.empty()) sta.pop();
for(int j = ; j < height.size(); j ++){
while( !sta.empty() && height[j] < height[sta.top()]){
int h = height[sta.top()];
sta.pop();
int idLeft = sta.size() > ? sta.top(): -;
maxArea = max(maxArea, h * (j - idLeft - ));
}
sta.push(j);
}
}
return maxArea;
}
};

PS: celebration , leetcode今天做完这两道题,已经干掉整100题了。不信? 哈哈 :

继续加油,别装逼~。~

最新文章

  1. ImitateLogin新增插件机制以及又一个社交网站的支持
  2. cocos2dx js 3.2 热更新
  3. [python] 视频008
  4. 《windows程序设计》学习_2.2:初识消息,双键的使用
  5. 科技股晴间多云 阿里京东IPO或受影响
  6. Scrum三头猪
  7. C# -- 等待异步操作执行完成的方式
  8. vhdl 数组
  9. 基于VC的MFC界面开发
  10. 一、linux 内核介绍
  11. scrapy框架的每个模块的用途
  12. iframe实现伪ajax
  13. docker swarm英文文档学习-12-在集群模式中的Raft共识
  14. pandas使用
  15. 80x86的保护模式
  16. Spring Boot + Spring Cloud 实现权限管理系统 后端篇(五):模块化切分
  17. Linux实验报告
  18. [LOJ6436][PKUSC2018]神仙的游戏
  19. jquery判断选择元素是否存在
  20. 【elasticsearceh】elasticsearch.yml配置文件详解

热门文章

  1. juruo的刷题&amp;博文祭
  2. 2.8 补充:shell变量引用方式
  3. Python基础(五)集合与函数
  4. 使用Mybatis的逆向工程自动生成代码
  5. 使用NamedParameterJdbcTemplate
  6. 在eclipse中如何在大量项目中查找指定文件
  7. nyoj 1112 求次数(map, set)
  8. POJ 2115 简单的模线性方程求解
  9. 【tomcat】如何修改tomcat的默认项目
  10. sharepoint第三方程序认证尝试失败记录