在Python中查找最小子矩阵的程序
假设我们有一个2D矩阵和另一个值k。我们的目标是返回一个包含所有k x k子矩阵中最低值的矩阵。
因此,如果输入如下所示
3 | 5 | 6 |
---|---|---|
8 | 6 | 5 |
4 | 3 | 12 |
并且 k =2,
那么输出将是[[3, 5],[3, 3]]。
从输入中我们可以看到左上角的子矩阵具有最低值3
右上角子矩阵具有最低值5
左下角子矩阵具有最低值3
右下角子矩阵具有最低值3
要解决这个问题,我们将按照以下步骤进行:
- 对于每个r,行索引为r和项行在矩阵中,执行以下操作-
- q :=一个新的双端队列
- nrow :=一个新的列表
- 对于i从0到行大小的范围,执行以下操作-
- 如果q和q[0]与i-k相同,则
- 弹出q的最左边的项
- 当q和行[q[-1]]>row[i]时,执行以下操作-
- 弹出q的最右边的项
- 将i插入到q的右端
- 在nrow的末尾插入row[q[0]]
- matrix[r] :=nrow
- 对于j从0到matrix [0]的大小,执行以下操作-
- q :=一个新的双端队列
- ncol :=一个新的列表
- 对于i从0到矩阵大小的范围,执行以下操作-
- 如果q和q[0]与i – k相同,则
- 弹出q的最左边的项
- 当q和matrix [q[-1]] [j]> matrix [i] [j]时,执行以下操作-
- 弹出q的最右边的项
- 将i插入到q的右端
- 在ncol的右端插入matrix [q [0],j]
- 对于i从0到矩阵大小的范围,执行以下操作-
- 矩阵[i,j] :=ncol [i]
- 如果q和q[0]与i – k相同,则
- ret:=一个新的大小为matrix-k + 1的列表,初始化为0
- 对于i从0到ret的大小的范围,执行以下操作-
- 对于j从0到ret [0]的大小的范围,执行以下操作-
- ret [i,j]:=矩阵[i + k-1,j + k-1]
- 对于j从0到ret [0]的大小的范围,执行以下操作-
- 返回ret
示例
让我们看下面的实现以更好地理解-