最大的矩形面积 Maximal Rectangle
2018-09-15 10:23:44
一、Largest Rectangle in Histogram
在求解最大的矩形面积之前,我们先讨论一条最大直方图面积的问题。
问题描述:

问题求解:
解法一、朴素解法,O(n ^ 2)。
解决的思路就是遍历一遍,如果当前的数比后一个数要小,那么当前的额数字肯定不可能是最大面积的右边界,遍历下一个数;
如果当前数比后一个大,那么假设当前的为右边界,向左进行遍历,计算面积最大值。
public int largestRectangleArea(int[] heights) {
if (heights.length == 0) return 0;
int res = 0;
for (int i = 0; i < heights.length; i++) {
if (i == heights.length - 1 || heights[i] > heights[i + 1]) {
int minHeight = heights[i];
for (int j = i; j >= 0; j--) {
minHeight = Math.min(heights[j], minHeight);
res = Math.max(res, minHeight * (i - j + 1));
}
}
}
return res;
}
解法二、使用堆栈,时间复杂度O(n)。
如何更快的解决这个问题呢?这里需要从另一个角度来考虑这个问题,其实解法一也是一种类似DP的解法,它的核心思路就是固定最后一个数,来获得以当前数为结尾的最大矩形面积。其实还有另一个角度来思考,就是以每个数作为高度能获得的最大面积是多少?其实这个问题就是需要找当前数左右第一个比其低的数,然后就可以得出以当前数字为高度的最大矩形面积,最后我们只需要遍历比较一遍就可以得到最大的结果。
public int largestRectangleArea(int[] nums) {
int n = nums.length;
int[] l = new int[n];
int[] r = new int[n];
Stack<Integer> stack = new Stack<>();
for (int i = 0; i < nums.length; i++) {
while (!stack.isEmpty() && nums[stack.peek()] >= nums[i]) stack.pop();
l[i] = stack.isEmpty() ? 0 : stack.peek() + 1;
stack.push(i);
}
stack.clear();
for (int i = nums.length - 1; i >= 0; i--) {
while (!stack.isEmpty() && nums[stack.peek()] >= nums[i]) stack.pop();
r[i] = stack.isEmpty() ? nums.length - 1 : stack.peek() - 1;
stack.push(i);
}
int res = 0;
for (int i = 0; i < n; i++) {
res = Math.max(res, nums[i] * (r[i] - l[i] + 1));
}
return res;
}
二、Maximal Rectangle
问题描述:

问题求解:
有个上一个问题的铺垫,这个问题就很好解决了,针对每一行,可以先求出其高度,然后再对每一行求最大最方图的面积,取max即可。
使用一个height的二维数组进行高度的保存,可以将时间复杂度降到O(mn)。
public int maximalRectangle(char[][] matrix) {
if (matrix.length == 0 || matrix[0].length == 0) return 0;
int m = matrix.length;
int n = matrix[0].length;
int[][] height = new int[m][n];
for (int i = 0; i < n; i++) if (matrix[0][i] == '1') height[0][i] = 1;
for (int i = 1; i < m; i++) {
for (int j = 0;j < n; j++) {
if (matrix[i][j] == '0') height[i][j] = 0;
else height[i][j] = 1 + height[i - 1][j];
}
}
int res = 0;
for (int i = 0; i < m; i++) {
res = Math.max(res, helper(height[i]));
}
return res;
}
private int helper(int[] nums) {
int n = nums.length;
int[] l = new int[n];
int[] r = new int[n];
Stack<Integer> stack = new Stack<>();
for (int i = 0; i < nums.length; i++) {
while (!stack.isEmpty() && nums[stack.peek()] >= nums[i]) stack.pop();
l[i] = stack.isEmpty() ? 0 : stack.peek() + 1;
stack.push(i);
}
stack.clear();
for (int i = nums.length - 1; i >= 0; i--) {
while (!stack.isEmpty() && nums[stack.peek()] >= nums[i]) stack.pop();
r[i] = stack.isEmpty() ? nums.length - 1 : stack.peek() - 1;
stack.push(i);
}
int res = 0;
for (int i = 0; i < n; i++) {
res = Math.max(res, nums[i] * (r[i] - l[i] + 1));
}
return res;
}
最大的矩形面积 Maximal Rectangle的更多相关文章
- LeetCode 84--柱状图中最大的矩形( Largest Rectangle in Histogram) 85--最大矩形(Maximal Rectangle)
84题和85五题 基本是一样的,先说84题 84--柱状图中最大的矩形( Largest Rectangle in Histogram) 思路很简单,通过循环,分别判断第 i 个柱子能够延展的长度le ...
- [Swift]LeetCode850. 矩形面积 II | Rectangle Area II
We are given a list of (axis-aligned) rectangles. Each rectangle[i] = [x1, y1, x2, y2] , where (x1, ...
- LeetCode 223. 矩形面积(Rectangle Area)
223. 矩形面积 223. Rectangle Area 题目描述 在二维平面上计算出两个由直线构成的矩形重叠后形成的总面积. 每个矩形由其左下顶点和右上顶点坐标表示,如图所示. LeetCode2 ...
- 求解最大矩形面积 — leetcode 85. Maximal Rectangle
之前切了道求解最大正方形的题,题解猛戳 这里.这道题 Maximal Rectangle 题意与之类似,但是解法完全不一样. 先来看这道题 Largest Rectangle in Histogram ...
- [LeetCode] Maximal Rectangle 最大矩形
Given a 2D binary matrix filled with 0's and 1's, find the largest rectangle containing all ones and ...
- [LeetCode] 85. Maximal Rectangle 最大矩形
Given a 2D binary matrix filled with 0's and 1's, find the largest rectangle containing only 1's and ...
- [LeetCode] Rectangle Area 矩形面积
Find the total area covered by two rectilinear rectangles in a2D plane. Each rectangle is defined by ...
- Largest Rectangle in a Histogram(最大矩形面积,动态规划思想)
Largest Rectangle in a Histogram Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 ...
- [Swift]LeetCode223. 矩形面积 | Rectangle Area
Find the total area covered by two rectilinear rectangles in a 2D plane. Each rectangle is defined b ...
随机推荐
- 在见证了1000多家公司的兴衰灭亡之后,YC创始合伙人总结了创业公司的6个不死法则(转)
今天,我想先说一下个人消息.在 YC 工作了 11 年之后,我明年想去休假.我希望把精力放在一些项目上,说实话,我有点累了. YC 是这世界上我最喜欢的事情之一,但它也很费精力. 11 年不间断的耗费 ...
- 20155201 网络攻防技术 实验五 MSF基础应用
20155201 网络攻防技术 实验五 MSF基础应用 一.实践内容 一个主动攻击实践,如ms08_067 一个针对浏览器的攻击,如ms11_050 一个针对客户端的攻击,如Adobe 成功应用任何一 ...
- PyCharm笔记之配色方案和取消波浪线
转载:http://blog.csdn.net/xiemanr/article/details/72583718 转载:http://www.jb51.net/article/50689.htm 一. ...
- sqlitestudio
SQLite数据库的特性 特点: 1.轻量级2.独立性,没有依赖,无需安装3.隔离性 全部在一个文件夹系统4.跨平台 支持众多操作系统5.多语言接口 支持众多编程语言6.安全性 事物,通过独占性和共享 ...
- swagger 基础入门
目录 Swagger简介 4 安装 4 一. Node.js 安装 4 二. node中http-server安装 4 三. 下载swagger-editor 4 四. 启动 swagger-edit ...
- How to check if one path is a child of another path?
How to check if one path is a child of another path? Unfortunately it's not as simple as StartsWith. ...
- 【特性】MySQL 8 新特性
MySQL 8.0 正式版 8.0.11 已发布,官方表示 MySQL 8 要比 MySQL 5.7 快 2 倍,还带来了大量的改进和更快的性能! 注意:从 MySQL 5.7 升级到 MySQL 8 ...
- html 之 position 绝对定位与相对定位(待补充)
相对定位:对于区块标签而言,占着原有的空间 绝对定位:对于网页而言,不占原来的空间
- 配置和运行 MatchNet CVPR 2015 MatchNet: Unifying Feature and Metric Learning for Patch-Based Matching
配置和运行 MatchNet CVPR 2015 GitHub: https://github.com/hanxf/matchnet 最近一个同学在配置,测试这个网络,但是总是遇到各种问题. 我也尝试 ...
- kubernetes 实战5_命令_Assign Pods to Nodes&Configure a Pod to Use a ConfigMap
Assign Pods to Nodes how to assign a Kubernetes Pod to a particular node in a Kubernetes cluster. Ad ...