You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

是否存在寻找和尽可能接近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):

  1. 预处理行前缀和
    先为每一行计算前缀和数组,这样能在O(1)时间内求出任意一行中任意列区间的元素和,预处理时间为O(n²)。

  2. 枚举左右列边界
    遍历所有可能的左列l和右列r(l ≤ r),将每一行中l到r列的元素和压缩为一个一维数组row_sums,其中row_sums[i]代表第i行l到r列的和。

  3. 转化为一维最接近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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 14:25:00