今天在制作书签的时候
突然想到了一个问题
如果要送给未来的女朋友一个书签
上面该写些什么话
哈哈哈哈哈哈哈哈哈
The Spring is coming!
想了一会儿,觉得这句话最合适
To xxx:
天使的笑,灿烂的心!!!
哎,还是先找个女朋友再说吧!
85-最大矩形
给定一个仅包含 0 和 1 的二维二进制矩阵,找出只包含 1 的最大矩形,并返回其面积。
示例:
输入:
[
["1","0","1","0","0"],
["1","0","1","1","1"],
["1","1","1","1","1"],
["1","0","0","1","0"]
]
输出: 6
思路:
这一题刚开始我一直以为得通过动态规划方法才能解决,想了许久还是没能解决便就此作罢,然后看了网上大佬的讲解,才发现还有另外一种很巧妙的方法可以解决。说实话,让我挠破脑皮也想不出来!关键就是:首先根据给定的matrix矩阵来更新每个元素的值,规则是:以该节点为起始点按列搜索,计算值连续为1的数目。这一步预处理也是最最最核心的一步,如下图所示:
第一步预处理完成了,接下来的工作就很简单了。只需要依次遍历新矩阵中每一行的元素,按照上述规则计算最大矩形面积。
代码如下:
class Solution(object):
# 本题其实是变形的84题-柱状图中最大的矩形
def maximalRectangle(self, matrix):
"""
:type matrix: List[List[str]]
:rtype: int
"""
# 首先根据给定的matrix矩阵来更新每个元素的值,规则是:以该节点为起始点按列搜索,计算值连续为1的数目
for row in range(len(matrix)):
for col in range(len(matrix[0])):
index = row
# 用来保存从[row][col]节点开始往下值连续为1的数目
height = 0
while index < len(matrix):
if matrix[index][col] == "1":
height += 1
else:
break
index += 1
matrix[row][col] = height
# 定义该矩阵内构成的最大面积
max_area = 0
# 遍历每一行使用第84题的方法来更新最大面积
for row in matrix:
max_area = max(max_area, self.get_max_area(row))
return max_area
# 获取每一行对应的柱状图中最大矩形面积
def get_max_area(self, heights):
i = 0
max_value = 0
stack = []
heights.append(0)
while i < len(heights):
if len(stack) == 0 or heights[stack[-1]] <= heights[i]:
stack.append(i)
i += 1
else:
now_idx = stack.pop()
if len(stack) == 0:
max_value = max(max_value, i * heights[now_idx])
else:
max_value = max(max_value, (i - stack[-1] - 1) * heights[now_idx])
return max_value
if __name__ == "__main__":
matrix = [["1", "0", "1", "0", "0"], ["1", "0", "1", "1", "1"], ["1", "1", "1", "1", "1"], ["1", "0", "0", "1", "0"]]
max_area = Solution().maximalRectangle(matrix)
print(max_area)
不过执行效率依旧不高,在10%左右。