我有一个sqaure矩阵和一个较小的正方形,它在矩阵内的所有可能位置移动(不会离开矩阵)。我需要在所有这些可能的重叠中找到最小的数字。
问题在于两者的大小可以达到数千。有什么快速的方法吗?
我知道一种方法 - 如果有一个数组而不是一个矩阵和一个窗口而不是一个正方形,我们可以使用 deque 在线性时间内完成。< / p>
提前致谢。
编辑:示例
矩阵:
1 3 6 2 5
8 2 3 4 5
3 8 6 1 5
7 4 8 2 1
8 0 9 0 5
对于大小为3的正方形,总共可以重叠9次。对于每个重叠,矩阵形式的最小数字是:
1 1 1
2 1 1
0 0 0
答案 0 :(得分:1)
可以在O(k * n^2)
中使用您的双端创意:
如果您的小方块为k x k
,则将矩阵中第一行元素从1重复到k
,并通过预先计算从1到{{1的最小元素数量来将其视为数组在矩阵的每一列中,从2到k
等(此预计算将采用k + 1
。这就是您的第一行:
O(k * n^2))
我提到的预计算会在每个列中给出最小值,因此您可以将问题减少到1d阵列问题。
然后继续从2到*********
1 3 6 2 5
8 2 3 4 5
3 8 6 1 5
*********
7 4 8 2 1
8 0 9 0 5
的元素行:
k + 1
将有1 3 6 2 5
*********
8 2 3 4 5
3 8 6 1 5
7 4 8 2 1
*********
8 0 9 0 5
行,您将能够在O(n)
中解决每一行,因为我们的预计算允许我们将它们缩减为基本数组。