问题描述:

  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题了。不信? 哈哈 :

继续加油,别装逼~。~

【Leetcode】84. Largest Rectangle in Histogram 85. Maximal Rectangle的更多相关文章

  1. 【LeetCode】84. Largest Rectangle in Histogram 柱状图中最大的矩形(Python)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 单调栈 日期 题目地址: https://leetc ...

  2. 【LeetCode】84. Largest Rectangle in Histogram

    Largest Rectangle in Histogram Given n non-negative integers representing the histogram's bar height ...

  3. 【LeetCode】84. Largest Rectangle in Histogram——直方图最大面积

    Given n non-negative integers representing the histogram's bar height where the width of each bar is ...

  4. 【LeetCode】764. Largest Plus Sign 解题报告(Python)

    [LeetCode]764. Largest Plus Sign 解题报告(Python) 作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn ...

  5. 【LeetCode】813. Largest Sum of Averages 解题报告(Python)

    [LeetCode]813. Largest Sum of Averages 解题报告(Python) 标签(空格分隔): LeetCode 作者: 负雪明烛 id: fuxuemingzhu 个人博 ...

  6. 【LeetCode】深搜DFS(共85题)

    [98]Validate Binary Search Tree [99]Recover Binary Search Tree [100]Same Tree [101]Symmetric Tree [1 ...

  7. 【一天一道LeetCode】#84. Largest Rectangle in Histogram

    一天一道LeetCode 本系列文章已全部上传至我的github,地址:ZeeCoder's Github 欢迎大家关注我的新浪微博,我的新浪微博 欢迎转载,转载请注明出处 (一)题目 Given n ...

  8. 【LeetCode】084. Largest Rectangle in Histogram

    题目: Given n non-negative integers representing the histogram's bar height where the width of each ba ...

  9. 【Leetcode】179. Largest Number

    Given a list of non negative integers, arrange them such that they form the largest number. For exam ...

随机推荐

  1. jetty添加容器容器提供包

    在tomcat的使用中,我们常常会吧容器提供的包放入:TOMCAT_HOME\lib下, 比如mysql-connection-java-version.jar 在使用jetty容器的时候,若要让容器 ...

  2. 关于markdown(typora)的操作指南,以及导出为word格式文件插件(pandoc-2.6-windows-x86_64)的下载

    Markdown简介 插件链接文章结尾处 目录 Markdown简介1. Markdown是什么?2. 谁创造了它?3. 为什么要使用它?4. 怎么使用?4.1 标题4.2 段落4.3 区块引用4.4 ...

  3. 【Codeforces 490C】Hacking Cypher

    [链接] 我是链接,点我呀:) [题意] 让你把一个字符串分成左右两个部分 形成两个正数 使得这两个正数一个能被a整除,一个能被b整除 找到任意一个解就可以 [题解] 枚举分割的断点i 枚举的时候用同 ...

  4. PageUtil ,简单的分页工具

    public class PageUtil { private int totalCount;//总数 private int pageSize=10;//每页显示数量 private int cur ...

  5. ci output

    ci output类可以将数据存起来,下面这个方法 a 代表的就是存起来的数据 public function(){ $data = array( 'name'=>'alice', ); $th ...

  6. ZOJ 题目2859 Matrix Searching(二维RMQ)

    Matrix Searching Time Limit: 10 Seconds      Memory Limit: 32768 KB Given an n*n matrix A, whose ent ...

  7. Lucene.Net 与 盘古分词

    1.关键的一点,Lucene.Net要使用3.0下面的版本号,否则与盘古分词接口不一致. 关键代码例如以下 using System; using System.IO; using System.Co ...

  8. LeetCode234_PalindromeLinkedList (推断是否为回文链表) Java题解

    题目: Given a singly linked list, determine if it is a palindrome. Follow up: Could you do it in O(n) ...

  9. View载入具体解释

    文章一開始我要对前面一篇文章做点补充 相信大家都知道View有两个方法. public boolean post(Runnable action) public boolean postDelayed ...

  10. LeetCode 83. Remove Duplicates from Sorted List (从有序链表中去除重复项)

    Given a sorted linked list, delete all duplicates such that each element appear only once. For examp ...