85. Maximal Rectangle 由1拼出的最大矩形
2024-08-31 12:09:37
[抄题]:
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]长才用比较面积
[输入量]:空: 正常情况:特大:特小:程序里处理到的特殊情况:异常情况(不合法不合理的输入):
[画图]:
[一刷]:
- 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;
}
}
最新文章
- SPOJ GSS1 Can you answer these queries I[线段树]
- PHP中include()与require()
- 【BZOJ2473/2120】维护队列 分块+二分
- Linux下tomcat部署
- Perl system(cmd) 和 `cmd` 的区别探讨
- python练习程序(c100经典例13)
- SQL Server 127个SQL server热门资料汇总
- 安装交叉编译arm-linux-gcc环境
- Java对存储过程的调用方法 --转载
- uC/OS-II内核架构解析(2)---uC/OS-II基本介绍(转)
- 关于快速沃尔什变换(FWT)的一点学习和思考
- linux内存源码分析 - 内存回收(lru链表)
- [原]jsbsim 自动驾驶c310ap文件改写
- 2017-2018-2 20165215 实验二 Java面向对象程序设计
- 机器学习基石笔记:15 Validation
- GTK, GTK+, Qt, KDE, GNOME, Unity的区别与联系
- 26、springboot与消息
- python闭包&;装饰器&;偏函数
- SyntaxError: can&#39;t assign to operator
- 设计模式之五:工厂方法模式(Factory Method)