有一个MxN大小矩阵,其中包含整数。我们需要找到最大尺寸的子矩阵,其中包含相同的整数。例如:
1 2 2 4 5
1 2 2 8 7
3 2 2 6 1
这里最大的子矩阵是3x2大小,其中包含全部2个。我的想法是检查每个元素arr [i] [j],arr [i] [j + 1],arr [i + 1] arr [j + 1]和arr [i + 1] [j]是否是是否平等。如果它们相等,那么我们可以以某种方式更新矩阵的最大尺寸。但我无法达到确切的解决方案。
我想知道我们是否可以使用动态编程。这是一个面试问题。
答案 0 :(得分:2)
假设子矩阵的底行是固定的。然后每列可以表示为一对(值,高度),其中value是此行和列中元素的值,高度是此列中连续元素的数量等于它。例如,如果矩阵是
3 1 2 3
1 2 2 1
3 2 2 1
2 2 2 2
,我们看到的底行是2(基于零的索引),值分别是(3,1),(2,2),(2,3)和(1,2)。
让我们将列拆分为将相邻元素组合在一起的组(对于前面的示例,它将是{(3,1)},{(2,2),(2,3)}和{(1,2)}。现在我们可以解决标准问题:给定一组值h[i]
,找到所有min(h[i], h[i + 1], ..., h[j]) * (j - i + 1)
和i
的{{1}}的最大值在每个组内(有一个使用堆栈的线性解决方案,如果需要,我可以详细说明这个。)它允许我们在线性时间内处理一行。
我们需要的最后一件事是有效地计算每行的(值,高度)数组。对于第一行,它是微不足道的。所以我们可以逐个遍历所有行和它们(当一个元素添加到列的底部时,(值,高度)对以两种可能的方式改变:它变为(new_value,1)或(value,height) + 1))。
这些观察结果允许我们在j
时间内处理一行。总时间复杂度为O(M)
。
这是一些代码(它不是完整的实现,它可能包含错误):
O(N * M)