[抄题]:

Given a 2D binary matrix filled with 0's and 1's, find the largest rectangle containing only 1's and return its area.

Example:

Input:
[
["1","0","1","0","0"],
["1","0","1","1","1"],
["1","1","1","1","1"],
["1","0","0","1","0"]
]
Output: 6

[暴力解法]:

时间分析:

空间分析:

[优化后]:

时间分析:

空间分析:

[奇葩输出条件]:

[奇葩corner case]:

二为矩阵:2个0,一个null

[思维问题]:

[英文数据结构或算法,为什么不用别的数据结构或算法]:

stack:把长度最长的列号暂存,然后取出来进行面积的比较

[一句话思路]:

新h[i]比旧h[i]长才能进,等于也行.

随着i的递增,旧h[i]比新h[i]长才用比较面积

[输入量]:空: 正常情况:特大:特小:程序里处理到的特殊情况:异常情况(不合法不合理的输入):

[画图]:

[一刷]:

  1. h[]数组表示的是纵向长度,里面的index应该是横向坐标 cLen。多开辟一列 并且初始化为0,用于POP stack中之前的元素

[二刷]:

[三刷]:

[四刷]:

[五刷]:

[五分钟肉眼debug的结果]:

[总结]:

stack中只存最之前和现在最长的

[复杂度]:Time complexity: O(n^2) Space complexity: O(n)

[算法思想:递归/分治/贪心]:

[关键模板化代码]:

[其他解法]:

dp is 2 hard

[Follow Up]:

[LC给出的题目变变变]:

84 histogram

[代码风格] :

class Solution {
public int maximalRectangle(char[][] matrix) {
//cc
if (matrix == null || matrix.length == 0 || matrix[0].length == 0) return 0; //ini: cLen, rLen, Stack : for longest index, h[rLen + 1]
int rLen = matrix.length, cLen = matrix[0].length, max = 0;
int[] h = new int[cLen + 1];
h[cLen] = 0; //for loop: row (new stack) * col < cLen + 1
for (int row = 0; row < rLen; row++) {
Stack<Integer> stack = new Stack<Integer>();
for (int i = 0; i < cLen + 1; i++) {
//store h[i]
if (i < cLen)
if (matrix[row][i] == '1') h[i] += 1;
else h[i] = 0; //store i, compare area, add i to stack again
if (stack.isEmpty() || h[i] >= h[stack.peek()])
//新比旧长才能进,等于也行
stack.push(i); else {
while (!stack.isEmpty() && h[i] < h[stack.peek()]) {//旧比新长才用比较
int top = stack.pop();
int area = h[top] * (stack.isEmpty() ? i : i - stack.peek() - 1);
max = Math.max(max, area);
}
stack.push(i);
}
}
} return max;
}
}

最新文章

  1. SPOJ GSS1 Can you answer these queries I[线段树]
  2. PHP中include()与require()
  3. 【BZOJ2473/2120】维护队列 分块+二分
  4. Linux下tomcat部署
  5. Perl system(cmd) 和 `cmd` 的区别探讨
  6. python练习程序(c100经典例13)
  7. SQL Server 127个SQL server热门资料汇总
  8. 安装交叉编译arm-linux-gcc环境
  9. Java对存储过程的调用方法 --转载
  10. uC/OS-II内核架构解析(2)---uC/OS-II基本介绍(转)
  11. 关于快速沃尔什变换(FWT)的一点学习和思考
  12. linux内存源码分析 - 内存回收(lru链表)
  13. [原]jsbsim 自动驾驶c310ap文件改写
  14. 2017-2018-2 20165215 实验二 Java面向对象程序设计
  15. 机器学习基石笔记:15 Validation
  16. GTK, GTK+, Qt, KDE, GNOME, Unity的区别与联系
  17. 26、springboot与消息
  18. python闭包&amp;装饰器&amp;偏函数
  19. SyntaxError: can&#39;t assign to operator
  20. 设计模式之五:工厂方法模式(Factory Method)

热门文章

  1. linux网络设备理解
  2. java web 程序---登陆验证4个页面
  3. 软件官网与memcached介绍
  4. nginx 反向代理与负载均衡应用实践
  5. 【洛谷】P1313 计算系数(快速幂+杨辉三角)
  6. 浅谈PHP面向对象编程(九、设计模式)
  7. zabbix agent主动模式与proxy模式,实现公网zabbix监控私网客户机
  8. Spring Boot自定义配置
  9. MyBatis Generator模板
  10. spring aop实现拦截接口请求打印日志