LeetCode Maximal Rectangle
2016-03-12 14:06
423 查看
LeetCode解题之Maximal Rectangle
原题
一个矩阵仅包含1和0,找出其中面积最大的只含有1的矩形,并返回它的面积。注意点:
矩阵中的元素类型是字符串
例子:
输入:
[code]matrix = [['1', '1', '0', '1', '0', '1'], ['0', '1', '0', '0', '1', '1'], ['1', '1', '1', '1', '0', '1'], ['1', '1', '1', '1', '0', '1']]
输出: 8
解题思路
这道题和 Largest Rectangle in Histogram 的关系非常密切。如果把1看做柱状的实体,那么这就是一个中间有空缺的柱状图。依次遍历每一行,把每一行当做柱状图的底边,就能将题目转化为Largest Rectangle in Histogram来解决。如以第二行为底,则是这样一个柱状图[1,2,0,0,1,1],容易发现规律:遍历下一行时,如果是1,则在原来的高度上加一,否则将高度置为0。AC源码
[code]class Solution(object): def maximalRectangle(self, matrix): """ :type matrix: List[List[str]] :rtype: int """ if not matrix or not matrix[0]: return 0 n = len(matrix[0]) heights = [0 for __ in range(n + 1)] result = 0 for row in matrix: for i in range(n): heights[i] = heights[i] + 1 if row[i] == '1' else 0 stack = [-1] for i in range(n + 1): while heights[i] < heights[stack[-1]]: h = heights[stack.pop()] w = i - stack[-1] - 1 result = max(result, h * w) stack.append(i) return result if __name__ == "__main__": assert Solution().maximalRectangle([['1', '1', '0', '1', '0', '1'], ['0', '1', '0', '0', '1', '1'], ['1', '1', '1', '1', '0', '1'], ['1', '1', '1', '1', '0', '1']]) ==8
欢迎查看我的Github (https://github.com/gavinfish/LeetCode-Python) 来获得相关源码。
相关文章推荐
- java异常浅析
- 连号区间数
- HDU 1021 Fibonacci Again
- hdu 1556 Color the ball(树状数组)
- 我的俄罗斯方块,WI32,GDI
- http协议学习系列
- 团队管理法则
- 根据两点经纬度计算距离
- 第二次上机实践项目-项目1-个人所得税计算器
- iOS截取视频缩略图的两种方法
- 再谈AC算法
- 团队晋升法则
- 团队生存法则
- Libevent源码分析(一)--- 基本数据结构
- 正则化方法:L1和L2 regularization、数据集扩增、dropout
- 利用hexo搭建博客
- C++11 lambda表达式
- CodeForces - 622A Infinite Sequence (思想)水
- FTP工作模式<二>
- 再谈KMP/BM算法(II)