作者: 负雪明烛
id: fuxuemingzhu
个人博客: http://fuxuemingzhu.cn/


题目地址: https://leetcode.com/problems/maximal-rectangle/description/

题目描述:

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

题目大意

给出了一个二维的数组,求在这里面能够成的最大的矩形面积是多少。

解题方法

本以为会和221. Maximal Square做法一样使用DP解决,可是感觉状态转移方程太复杂,所以还是参考了84. Largest Rectangle in Histogram升级版的解法。

如图所示,如果把每一行的1和它上面的1连在一起,那么就可以看成一个个站里的矩形方块。那么我们的最终目的就是找出最大面积的矩形方块,所以就是第84题的做法了,使用单调栈。

需要注意的是,我们使用一个height数组,保存到某一层的第i个位置为止,能向上构成的矩形的高度。而且需要对每层都做一个寻找面积的操作,最终选择所有层中能够成矩形面积最大值。

时间复杂度是O(M(N+M)),空间复杂度是O(N)。

class Solution(object):
def maximalRectangle(self, matrix):
"""
:type matrix: List[List[str]]
:rtype: int
"""
if not matrix or not matrix[0]: return 0
M, N = len(matrix), len(matrix[0])
height = [0] * N
res = 0
for row in matrix:
for i in range(N):
if row[i] == '0':
height[i] = 0
else:
height[i] += 1
res = max(res, self.maxRectangleArea(height))
return res def maxRectangleArea(self, height):
if not height: return 0
res = 0
stack = list()
height.append(0)
for i in range(len(height)):
cur = height[i]
while stack and cur < height[stack[-1]]:
w = height[stack.pop()]
h = i if not stack else i - stack[-1] - 1
res = max(res, w * h)
stack.append(i)
return res

参考资料:

https://www.jianshu.com/p/cffdc94c9c19

日期

2018 年 10 月 10 日 —— 冻成狗

最新文章

  1. 传智播客DotNet面试题
  2. 北京电子科技学院(BESTI)实验报告3
  3. nodejs cookie管理
  4. python求范数
  5. MyEclipse10启动Tomcat8出错
  6. springMvc全局异常处理
  7. 错误处理:加载文件或程序集“ICSharpCode.SharpZipLib”
  8. ColorFilter类
  9. hdu 4634 Swipe Bo 搜索
  10. bzoj1675 [Usaco2005 Feb]Rigging the Bovine Election 竞选划区
  11. WPF中图形表示语法详解(Path之Data属性语法)
  12. .Net Core在X86上实现Interlocked.Increment(ref long)的方式
  13. JS-随机生成的密码
  14. socket,模拟服务器、客户端通信
  15. HotSpot 虚拟机垃圾回收算法实现
  16. CF95C Volleyball
  17. Controller层aop
  18. python顺序执行多个py文件
  19. 【目录】LeetCode Java实现
  20. MySql union与order by

热门文章

  1. svn简单上传下载文件命令
  2. 4.Reverse Words in a String-Leetcode
  3. 类成员函数调用delete this会发生什么呢?
  4. 巩固javaweb第一天
  5. day09 orm查询优化相关
  6. Hive(五)【DQL数据查询】
  7. [Windows编程]模块遍历
  8. OpenStack之二: 安装OpenStack的yum源及相关组件
  9. spring-cloud-alibaba-dependencies版本问题
  10. 【Java基础】HashMap原理详解