求解最大矩形面积 — leetcode 85. Maximal Rectangle
之前切了道求解最大正方形的题,题解猛戳 这里。这道题 Maximal Rectangle 题意与之类似,但是解法完全不一样。
先来看这道题 Largest Rectangle in Histogram,如果暴力求解,可以枚举每个点为最小值,向两边扩展,复杂度 O(n^2)。我们可以维护一个栈,从而将复杂度降低到 O(n),这个栈的思维非常巧妙,参考了 discuss,我是完全想不出来(或者说忘记了)。具体代码可以猛戳 这里。
2016-08-07 补:stack 数组维护的是一个单调递增的数组,这貌似就是传说中的单调队列吧,后知后觉的我 ...
/**
* @param {number[]} heights
* @return {number}
*/
var largestRectangleArea = function(heights) {
heights.push(0);
var maxn = 0;
var stack = [];
for (var i = 0, len = heights.length; i < len; i++) {
while (stack.length && heights[i] < heights[stack[stack.length - 1]]) {
var top = stack.pop();
var nextTop = stack.length === 0 ? -1 : stack[stack.length - 1];
maxn = Math.max((i - nextTop - 1) * heights[top], maxn);
}
stack.push(i);
}
return maxn;
};
有了这个作为基础,求解最大矩形也就不难了。可以一层层向下走,维护一个数组,每次去求解当时的最值即可。代码如下。
/**
* @param {number[]} heights
* @return {number}
*/
var largestRectangleArea = function(heights) {
heights.push(0);
var maxn = 0;
var stack = [];
for (var i = 0, len = heights.length; i < len; i++) {
while (stack.length && heights[i] < heights[stack[stack.length - 1]]) {
var top = stack.pop();
var nextTop = stack.length === 0 ? -1 : stack[stack.length - 1];
maxn = Math.max((i - nextTop - 1) * heights[top], maxn);
}
stack.push(i);
}
return maxn;
};
/**
* @param {character[][]} matrix
* @return {number}
*/
var maximalRectangle = function(matrix) {
if (!matrix.length)
return 0;
var n = matrix.length
, m = matrix[0].length;
var heights = [];
for (var i = 0; i < m; i++)
heights[i] = 0;
var ans = 0;
for (var i = 0; i < n; i++) {
for (var j = 0; j < m; j++) {
if (matrix[i][j] === '1')
heights[j]++;
else
heights[j] = 0;
}
ans = Math.max(ans, largestRectangleArea(heights));
}
return ans;
};
说实话这道题的解法没有认真想(算是抄的吧,这完全不符合我的个性)。最近有点浮躁,也有点烦躁,相信一切都是瞬息,一切都将会过去。
暂时先把 leetcode 放一放吧。
睡觉,身累心累啊。
求解最大矩形面积 — leetcode 85. Maximal Rectangle的更多相关文章
- [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 (85): Maximal Rectangle [含84题分析]
链接: https://leetcode.com/problems/maximal-rectangle/ [描述] Given a 2D binary matrix filled with '0's ...
- leetCode 85.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
给定一个只含0和1的数组,求含1的最大矩形面积. Given a 2D binary matrix filled with 0's and 1's, find the largest rectangl ...
- 求解最大正方形面积 — leetcode 221. Maximal Square
本来也想像园友一样,写一篇总结告别 2015,或者说告别即将过去的羊年,但是过去一年发生的事情,实在是出乎平常人的想象,也不具有代表性,于是计划在今年 6 月份写一篇 "半年总结" ...
- 【leetcode】Maximal Rectangle
Maximal Rectangle Given a 2D binary matrix filled with 0's and 1's, find the largest rectangle conta ...
- 刷题85. Maximal Rectangle
一.题目说明 题目,85. Maximal Rectangle,计算只包含1的最大矩阵的面积.难度是Hard! 二.我的解答 看到这个题目,我首先想到的是dp,用dp[i][j]表示第i行第j列元素向 ...
- 85. Maximal Rectangle
85. Maximal Rectangle Given a 2D binary matrix filled with 0's and 1's, find the largest rectangle c ...
- 【leetcode】85. Maximal Rectangle(单调栈)
Given a rows x cols binary matrix filled with 0's and 1's, find the largest rectangle containing onl ...
随机推荐
- spring mvc基础配置
web.xml 配置: <servlet> <servlet-name>dispatcher</servlet-name> <servlet-class> ...
- 已知2个一维数组:a[]={3,4,5,6,7},b[]={1,2,3,4,5,6,7};把数组a与数组b ,对应的元素乘积再赋值给数组b,如:b[2]=a[2]*b[2];最后输出数组b的元素。
int[]a={3,4,5,6,7}; int[]b={1,2,3,4,5,6,7}; int[] arry=new int[7]; System.out.print("数组b[]={&qu ...
- jqGrid 学习笔记--数据异步加载方法(转)
var commonQuery = '../importantInfoReport/pageQueryImportantInfoReport.action?type=0'; jQuery(" ...
- openstack-kilo--issue(十一)Failed connect to 169.254.169.254:80; No route to host
# curl http://169.254.169.254/latest/user-data curl: () Failed connect to ; No route to host 解决方案: c ...
- mongo数据备份及恢复脚本
#!/bin/bashtime="$(date +"%Y.%m.%d")" id=`echo "show dbs;"|/usr/local/ ...
- (转)android.intent.action.MAIN与android.intent.category.LAUNCHER
android.intent.action.MAIN决定应用程序最先启动的Activity android.intent.category.LAUNCHER决定应用程序是否显示在程序列表里 在网上看到 ...
- spring 注入一个以枚举类型对象
1.枚举 在实际编程中,往往存在着这样的“数据集”,它们的数值在程序中是稳定的,而且“数据集”中的元素是有限的. 例如星期一到星期日七个数据元素组成了一周的“数据集”,春夏秋冬四个数据元素组成了四季的 ...
- shell编程入门
背景知识 Shell 是用户与内核进行交互操作的一种接口,是 Linux 最重要的软件之一.目前最流行的 Shell 称为 bash Shell,bash Shell 脚本编程以其简洁.高效而著称,多 ...
- (一)半小时开发一个APP
[前言] HPP是什么? HybirdApp的简称,详细介绍参见:HPP--让所有中小企业拥有自己的APP 说白了就是用html+css+js开发app,包括ios和android版本. HBuild ...
- 了解 Office 365
Office 2016刚刚发布,那么Office 2016和Office 365是什么关系呢?通过Office 365与传统Office套件的对比,我们可以更好地理解SaaS的本质.SaaS的商业模式 ...