算法 - 在 n*n 二维矩阵中找到 k*k 集合的所有最大值

Algorithm - Finding all maxima of k*k sets in n*n 2D Matrix

我有一个 N*N 2D 矩阵。我想找到每组 k*k 子网格的所有最大值。什么应该是有效的 algorithm.For 示例,

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

如果你能保证没有一个元素是负数,那么你的问题确实可以在O(N2)次。诀窍是使用 sliding window minimum/maximum algorithm.

首先,运行输入矩阵每一行的滑动window最小值和最大值算法,给你两个N×(Nk + 1) 矩阵。例如:

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

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

接下来,运行 滑动 window 两个各自矩阵的每一列上的最小值和最大值算法,给你两个 (Nk + 1)2 矩阵.

Minimum matrix:
  0 1 1
  2 0 0

Maximum matrix:
  5 3 4
  5 3 7

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