leetcode最大矩形 (动态规划 python)

描述

给你一个二维矩阵,权值为False和True,找到一个最大的矩形,使得里面的值全部为True,输出它的面积

您在真实的面试中是否遇到过这个题?
样例
样例1

输入:
[
[1, 1, 0, 0, 1],
[0, 1, 0, 0, 1],
[0, 0, 1, 1, 1],
[0, 0, 1, 1, 1],
[0, 0, 0, 0, 1]
]
输出: 6
样例2

输入:
[
[0,0],
[0,0]
]
输出: 0

解题思路

假设我们输入的矩形第一行数时是:
[1, 1, 1, 0, 1,1,0,1,1]
我们统计这行的最大宽度:
得到数组a如下:
a=1,2,3,0,1,2,0,1,2]

正式解题

1.输入矩形
[
[1, 1, 0, 0, 1],
[0, 1, 0, 0, 1],
[0, 0, 1, 1, 1],
[0, 0, 1, 1, 1],
[0, 0, 0, 0, 1]
]
maxarea=0
2.然后对矩形的第一行统计最大宽度
得到宽度数组:
[1,2,0,0,1]
计算最大面积=2
更新maxarea
3.然后对矩形的第二行统计最大宽度:
得到宽度数组:
[0, 1, 0, 0, 1]
计算面积:分两步
第一步:计算当前宽度数组最大面积为1 如果大于maxarea 则更新maxarea
第二步 :计算当前宽度数组和上一宽度数组产生的最大面积:
最大面积应为同一列数的(最小值) 乘以 (行数)
结果为1乘以2=2
如果大于maxarea 则更新maxarea
4.然后对矩形的第三行统计最大宽度:
得到宽度数组[0, 0, 1, 1, 1]
在计算这行产生的最大面积时。
第一步只把第三行宽度数组,计算只有第三行宽度度数组产生的最大面积:结果1 如果大于maxarea 则更新maxarea
第二步: 计算(第三行宽度数组,第二行宽度数组)最大面积 2
如果大于maxarea 则更新maxarea
第三步:最后在计算(第三行宽度数组,第二行宽度数组 ,第一行宽度数组)的最大面积。如果大于maxarea 则更新maxarea

后面类似:

整个过程应该是个动态:
代码如下:

lass Solution:
	def maxmalRectangle(self , matrix):
		m = len(matrix)
		n = len(matrix[0])
		maxarea = 0
		dp = [[0]*n for _ in range(m)]
		for i in range(m):#遍历每一列
			for j in range(n):#遍历每一行
				if matrix[i][j] == 0:
					continue
				width = dp[i][j] = dp[i][j-1] + 1 if j else 1#计算最大宽度并使用它更新dp
				for k in range(i,-1,-1):#倒序遍历每一行
					width = min(width , dp[k][j])#最小宽度(同一列 上下几行的最小【最大宽度】)
					maxarea = max(maxarea , width*(i - k + 1)) #同一列上下几行的最小【最大宽度】*行数=当前行最大面积
		return maxarea
test = Solution()
d=test.maxmalRectangle([
  [1, 1, 0, 0, 1],
  [0, 1, 0, 0, 1],
  [0, 0, 1, 1, 1],
  [0, 0, 1, 1, 1],
  [0, 0, 0, 0, 1]
])
print(d)

结果:6

猜你喜欢

转载自blog.csdn.net/kobeyu652453/article/details/106735776