这个题比刚才那个更难。

假设没做过上一个,这个简直是无情。

先想一个笨笨的解法,如何确定一个矩形呢?找一个左上角,然后每行的看能延伸到什么位置。注意随着行数的添加,列数是仅仅能变短,不能变长。

想一下也知道这样的方法的复杂度有多高。超时无疑。

假设刚好做了这个求柱形的题目。会不会收到启示呢。将矩阵中的每个1都看做是一个小的正方形。在每一列,连续的1就构成了一个柱体。求一连串这种柱体围成的最大面积就是全部1构成的最大矩形,问题被完美转化。

尽管在我看来。这种转化是非常不easy的,要不是这两个题目相邻。太难想到了。

这给了我们非常好的教训,不同的形状之间或许存在着某种联系。

置于怎么构造这种柱形就简单的多了,每一行都须要计算。看当前行当前列是1还是0,是1的话在上一行相应列的基础上长高1,是0的话直接就是0了。返回最大的面积。

class Solution {
public:
int largestArea(int *height, int length){
stack<int> s;
int i=0, res=0, tpres, tph;
while(i<length){
if(s.empty()||height[s.top()]<=height[i]){
s.push(i++);
}else{
tph = height[s.top()];
s.pop();
tpres = tph*(s.empty()?i:i-s.top()-1);
res = max(res, tpres);
}
}
while(!s.empty()){
tph = height[s.top()];
s.pop();
tpres = tph*(s.empty()?i:i-s.top()-1);
res = max(res, tpres);
}
return res;
}
int maximalRectangle(vector<vector<char> > &matrix) {
int m = matrix.size();
if(m == 0) return 0;
int n = matrix[0].size();
int **h = new int*[m];
for(int i=0;i<m;i++){
h[i] = new int[n];
memset(h[i], 0, sizeof(int)*n);
}
for(int j=0;j<n;j++){
if(matrix[0][j] == '1'){
++h[0][j];
}
}
for(int i=1;i<m;i++){
for(int j=0;j<n;j++){
if(matrix[i][j] == '1'){
h[i][j] = h[i-1][j]+1;
}
}
}
int res = 0;
for(int i=0;i<m;i++){
res = max(res, largestArea(h[i], n));
delete [] h[i];
}
delete [] h;
return res;
}
};

leetcode第一刷_Maximal Rectangle的更多相关文章

  1. leetcode第一刷_Largest Rectangle in Histogram

    非常难的问题,数组线性时间. 属于我之前说的解法的借助辅助空间.给定两个柱子,他们之间的面积由什么确定呢?没错,他们之间的距离和他们之间最矮的那个柱子的高度.我们并不知道这个柱子在什么位置,所以仅仅能 ...

  2. leetcode第一刷_Set Matrix Zeroes

    这个题乍一看非常easy,实际上还挺有技巧的.我最開始的想法是找一个特殊值标记.遇到一个0,把他所相应的行列中非零的元素标记成这个特殊值.0值保持不变,然后再从头遍历一次,碰到特殊值就转化成0. 问题 ...

  3. leetcode第一刷_Permutations II

    当有反复元素的时候呢? 不用拍脑袋都会想到一种方法,也是全部有反复元素时的通用处理方法,维护一个set,假设这个元素没增加过就增加,增加过了的忽略掉.可是,在这道题上这个通用方法竟然超时了! 怎么办? ...

  4. leetcode第一刷_Populating Next Right Pointers in Each Node II

    很自然的推广,假设去掉全然二叉树的条件呢?由于这个条件不是关键,因此不会影响整体的思路.做法依旧是每次找到一层的起点,然后一层一层的走. 假设是全然二叉树的话,每层的起点就是上一层起点的左孩子,兄弟之 ...

  5. leetcode第一刷_Merge Intervals

    看到这个题我就伤心啊,去微软面试的时候,第一个面试官让我做的题目就是实现集合的交操作,这个集合中的元素就像这里的interval一样.是一段一段的.当时写的那叫一个慘不忍睹.最后果然被拒掉了. .好好 ...

  6. leetcode第一刷_N-Queens

    八皇后问题应该是回溯法的教学典范.在本科的时候,有一门课叫面向对象.最后的附录有这个问题的源码.当时根本不懂编程,照抄下来,执行一下出了结果都非常开心,哎. 皇后们的限制条件是不能同行同列,也不能同对 ...

  7. leetcode第一刷_Gray Code

    说到格雷码,应该没人不知道,详细它有什么用,我还真不是非常清楚,我室友应该是专家.生成的规律不是非常明显,之前看到帖子讲的,这会儿找找不到了.. 思想是这种,假设有n位,在第2^(n-1)个编码以下画 ...

  8. leetcode第一刷_Combination Sum Combination Sum II

    啊啊啊啊.好怀念这样的用递归保存路径然后打印出来的题目啊.好久没遇到了. 分了两种,一种是能够反复使用数组中数字的,一种是每一个数字仅仅能用一次的.事实上没有多大差别,第一种每次进入递归的时候都要从头 ...

  9. leetcode第一刷_Count and Say

    水题. 描写叙述的还挺麻烦的,实际上就是纸老虎,用两个string,一个存上一轮的结果,一个用来更新出这一轮的结果,每次扫描上一轮,统计一个字符出现的次数,然后把这个次数和字符增加到这一轮的字符串中就 ...

随机推荐

  1. Noip2009提高组总结

    Noip2009的题目还是有一定难度的,主要是搜索和最短路都是我的弱项,不检查第一遍下来只做了150分,还是这句话,素质和读题的仔细程度决定了分数.仔细想想,我们化学老师说的话没错,或许题目你都会做, ...

  2. HDU 2178 猜数字

    题解:设猜到的最大的数是h,在1到h间,你最多只要猜log2(h)+1(取整)次,所以易知==>h=2^m-1.即猜m次,能猜到的最大的数为2^m-1. #include <cstdio& ...

  3. 1005 - Rooks(规律)

    1005 - Rooks   PDF (English) Statistics Forum Time Limit: 1 second(s) Memory Limit: 32 MB A rook is ...

  4. openstack之Nova

    一.Nova简介及其核心组件: Nove在openstack中提供计算服务: Nova核心模块: Controller Nova-api:提供API,包括命令行API; Nova-schedule: ...

  5. asp.net个人笔记

    1.进程外session一记 配置进程外session, 在webconfig中配置<sessionState timeout="60" mode="StateSe ...

  6. 设计模式值六大原则——开闭原则(OCP)

    开闭原则(Open Closed Principle)是Java世界里最基础的设计原则,它指导我们如何建立一个稳定的.灵活的系统. 定义: 一个软件实体如类.模块和函数应该对扩展开放,对修改关闭. S ...

  7. oracle去除字符串中间的空格

    update AC01 A set A.AAC003 = REGEXP_REPLACE(A.AAC003, '( ){1,}', '') WHERE A.AAC002 IN (SELECT AAC00 ...

  8. jquery 几点注意事项

    jquery触发hover事件 使用 mouseenter/mouseleave/mouseover/mouseout

  9. Java学习笔记51:数组转ArrayList和ArrayList转数组技巧

    ArrayList转数组: public class Test { public static void main(String[] args) { List<String> list = ...

  10. 使用msys

    下载地址:http://msys2.github.io/ 更新:pacman -Syu 安装git:pacman -S git 或者使用cygwin 调色:编辑~/.minttyrc Foregrou ...