假设我们有一个二进制矩阵,我们必须在该给定矩阵中找到所有1的最大矩形。可以通过交换或交换该矩阵的任何一对列来构建矩形。
所以,如果输入像
1 | 0 | 0 | 1 | 0 |
1 | 0 | 0 | 1 | 1 |
1 | 1 | 0 | 1 | 0 |
那么在这种情况下,输出将为6。可以通过将列1与3交换来生成矩形。交换后的矩阵为-
0 | 0 | 1 | 1 | 0 |
0 | 0 | 1 | 1 | 1 |
1 | 0 | 1 | 1 | 0 |
为了解决这个问题,我们将遵循以下步骤-
行:=垫子的尺寸
col:=垫子的尺寸[0]
temp:=阶数(行+ 1)x(col + 1)的矩阵,并用0填充
因为我的范围是0到col,
如果mat [j,i]等于0,则
除此以外,
temp [j,i]:= 0
temp [j,i]:= temp [j-1,i] + 1
temp [0,i]:= mat [0,i]
对于范围1至行中的j,执行
对于范围在0到行之间的i,执行
如果cnt [j]> 0,则
j:= j-1
temp [i,col_no]:= j
col_no:= col_no + 1
对于0到cnt [j]范围内的k,执行
cnt [temp [i,j]]:= cnt [temp [i,j]] + 1
cnt:=一个大小为(行+ 1)的数组,并用0填充
对于范围0到col的j,增加1,执行
col_no:= 0
j:=行
当j> = 0时
area_maximum:= 0
对于范围在0到行之间的i,执行
area_current:=(j + 1)* temp [i,j]
如果area_current> area_maximum,则
area_maximum:= area_current
对于范围0到col的j,执行
返回area_maximum
让我们看下面的实现以更好地理解-
def maxArea(mat): row = len(mat) col = len(mat[0]) temp = [[0 for i in range(col + 1)] for i in range(row + 1)] for i in range(0, col): temp[0][i] = mat[0][i] for j in range(1, row): if ((mat[j][i] == 0)): temp[j][i] = 0 else: temp[j][i] = temp[j - 1][i] + 1 for i in range(0, row): cnt = [0 for i in range(row + 1)] for j in range(0, col, 1): cnt[temp[i][j]] += 1 col_no = 0 j = row while(j >= 0): if (cnt[j] > 0): for k in range(0, cnt[j]): temp[i][col_no] = j col_no += 1 j -= 1 area_maximum = 0 for i in range(0, row): for j in range(0, col): area_current = (j + 1) * temp[i][j] if (area_current > area_maximum): area_maximum = area_current return area_maximum mat = [ [0, 0, 1, 1, 0], [0, 0, 1, 1, 1], [1, 0, 1, 1, 0]] print("Area : ",maxArea(mat))
[ [1, 0, 0, 1, 0], [1, 0, 0, 1, 1], [1, 1, 0, 1, 0]]
输出结果
Area : 2