LeetCode最大矩形
给定一个仅包含 0 和 1 、大小为 rows x cols 的二维二进制矩阵,找出只包含 1 的最大矩形,并返回其面积。
示例 1:
输入:matrix = [["1","0","1","0","0"],["1","0","1","1","1"],["1","1","1","1","1"],["1","0","0","1","0"]]
输出:6
解释:最大矩形如上图所示。
示例 2:
输入:matrix = []
输出:0
示例 3:
输入:matrix = [["0"]]
输出:0
示例 4:
输入:matrix = [["1"]]
输出:1
示例 5:
输入:matrix = [["0","0"]]
输出:0
思路:
只有要有上一题:84柱状图中最大矩形的基础,这道题完全就是送分题。
这道题是求矩阵中的最大矩形,可以转化成求柱状图中的最大矩形。如何转化呢?对于n行的矩形,我们把它分成n部分来看。第一部分就是前一行,第二部分是前两行,第n部分就是前n行。
对于每一个部分,底部为1就代表是一个柱子,从底向上有三个连续1就代表柱子的高为3。当然如果有一个0,就会导致柱子“断开”,就不算是柱子了。由此,每一部分都可以转化成求柱状图中最大矩形问题。
“求柱状图中最大矩形代码”我们直接复用。我们只需要从上往下遍历矩阵,逐渐添加进新的行来组成新的部分,把新的部分送入“求柱状图中最大矩形代码”来得到结果,最终选出最大的结果即可。
代码:
class Solution(object):
def maximalRectangle(self, matrix):
#默写一遍柱状图最大矩阵,整个函数一模一样
def max_matrix_area(height):
stack=[]
lenth =len(height)
left_res=[0]*lenth
right_res=[0]*lenth
for i in range(lenth-1,-1,-1):
while(stack and height[stack[-1]]>=height[i]):
stack.pop()
right_res[i] = stack[-1]-i if stack else lenth-i
stack.append(i)
height1 = height[::-1]
stack=[]
for i in range(lenth-1,-1,-1):
while(stack and height1[stack[-1]]>=height1[i]):
stack.pop()
left_res[i] = stack[-1]-i if stack else lenth-i
stack.append(i)
left_res=left_res[::-1]
maxx=0
for i,h in enumerate(height):
maxx=max(maxx,(left_res[i]+right_res[i]-1)*h)
return maxx
#处理特殊情况
if not matrix:
return 0
m = len(matrix)
n = len(matrix[0])
hei=[0]*n#hei用来模拟我们的柱状图
total_res=0#存放总结果
for i in range(m):#遍历每一层
for j in range(n):#新部分的底部遍历一遍,得到每一个位置的“高度”
if matrix[i][j]=='1':#只有是1,才可以继承上面的 +1
hei[j]+=1
else:#如果当前是0,则中断,不能继承上面的
hei[j]=0
#得到柱状图数组后,计算最大矩阵并尝试更新最大值
total_res=max(total_res,max_matrix_area(hei))
return total_res
小结:
这道题完完全全可以复用84题柱状图中最大矩形的代码,只不过在外部加了点修改。其中我们从上到下遍历矩阵,每组成一个新的部分就有一个根据是否为1来判断是否可以和上面连起来组成柱子的操作,一旦是0则柱子肯定是断开的,高度也直接清零。把这个算是比较巧妙的过程弄懂之外,别的就只剩轻松利用之前代码了~
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了