我有一个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
答案 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。