算法 - 在n * n 2D矩阵中查找k * k集的所有最大值

时间:2017-10-18 11:52:00

标签: algorithm multidimensional-array 2d

我有一个N*N 2D矩阵。我想找到每个集合k * k子网格的所有最大值。什么应该是有效的算法。例如,

N = 4,k = 2

0 1 3 1
5 2 1 4
2 3 0 7

输出:3, 4, 5

3来自

1 3
2 1

4来自

3 1
1 4

和5来自

5 2
2 3

某些子集不计数,因为它们具有非设置位,0在k * k限制内。例如,

1 4
0 7

1 个答案:

答案 0 :(得分:2)

如果您可以保证没有元素是否定的,那么您的问题确实可以在 O N 2 )时解决。诀窍是使用sliding window minimum/maximum algorithm

首先,在输入矩阵的每一行上运行滑动窗口最小和最大算法,给你两个 N ×( N - k + 1)矩阵。例如:

Minimum matrix:
  0 1 1
  2 1 1
  2 0 0

Maximum matrix:
  1 3 3
  5 2 4
  3 3 7

接下来,在两个相应矩阵的每一列上运行滑动窗口最小和最大算法,给你两个( N - k + 1) 2 matrices。

Minimum matrix:
  0 1 1
  2 0 0

Maximum matrix:
  5 3 4
  5 3 7

现在同时扫描两个矩阵,如果最小矩阵元素不为0,则从最大矩阵输出相应的元素。因此我们输出3,4,5。