是否存在寻找和尽可能接近k的矩形子矩阵的高效算法?
寻找和尽可能接近k的非负整数矩形子矩阵的高效算法
是否存在一种高效算法,用于寻找和尽可能接近k的矩形子矩阵?该矩阵仅由非负整数组成,要求算法时间复杂度优于O(n4)(遍历所有子矩阵的方法复杂度为O(n4))。可通过前缀和在O(1)时间内计算子矩阵和。已了解一维数组中的类似问题,但无法将其适配到矩阵场景。
示例
输入矩阵:
[1, 2, 3] [4, 5, 6] [7, 8, 9]
k = 25
答案为:
[7, 8, 9]
其和为24,是最接近25的子矩阵和。
高效算法实现思路
针对n×n的非负整数矩阵,可通过固定列边界+一维问题转化的思路实现O(n² log n)的时间复杂度,远优于O(n^4):
预处理行前缀和
先为每一行计算前缀和数组,这样能在O(1)时间内求出任意一行中任意列区间的元素和,预处理时间为O(n²)。枚举左右列边界
遍历所有可能的左列l和右列r(l ≤ r),将每一行中l到r列的元素和压缩为一个一维数组row_sums,其中row_sums[i]代表第i行l到r列的和。转化为一维最接近k问题
对每个row_sums数组,求解连续子数组和最接近k的问题(这正是你熟悉的一维场景)。由于矩阵元素非负,row_sums中的元素也非负,此时可以用前缀和+有序集合的方法:- 维护当前的前缀和,遍历数组时将前缀和存入有序集合
- 对每个当前前缀和,在有序集合中查找与
当前前缀和 - k最接近的值,以此计算最接近k的子数组和
这一步的时间复杂度为O(n log n)。
整体时间复杂度为O(n² log n),完全满足优于O(n^4)的要求。
示例验证
当固定左列=0、右列=2时,row_sums数组为[6, 15, 24]。对这个一维数组求解最接近25的连续子数组,最后一个元素24与25的差值最小,对应原矩阵的第三行,即示例中的答案。
内容的提问来源于stack exchange,提问作者qpexxtt
相关产品推荐
相关产品推荐

