1. 问题背景与理解
今天咱们来啃一道LeetCode上的二维数组处理题——第3567题"子矩阵的最小绝对差"。这道题在周赛中出现时让不少选手栽了跟头,主要考察我们对二维数组的预处理和滑动窗口技巧的综合运用能力。
先明确题目要求:给定一个m x n的整数矩阵matrix和一个整数k,我们需要找到所有k x k子矩阵中元素和的最小绝对差。这里的绝对差指的是该子矩阵元素和与所有k x k子矩阵元素和中位数的差的绝对值。
举个例子,假设有个3x3矩阵:
code复制[1, 2, 3]
[4, 5, 6]
[7, 8, 9]
当k=2时,可能的2x2子矩阵有:
- 左上角子矩阵和:1+2+4+5=12
- 右上角子矩阵和:2+3+5+6=16
- 左下角子矩阵和:4+5+7+8=24
- 右下角子矩阵和:5+6+8+9=28
这些和的中位数是(16+24)/2=20(偶数个取中间两个的平均),那么最小绝对差就是min(|12-20|, |16-20|, |24-20|, |28-20|)=4。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 暴力解法与复杂度分析
2.1 直观暴力解法
最直接的思路就是枚举所有可能的k x k子矩阵,计算每个子矩阵的和,然后找出中位数,最后计算最小绝对差。具体步骤:
- 遍历所有可能的子矩阵左上角位置(i,j),其中0≤i≤m-k, 0≤j≤n-k
- 对于每个(i,j),计算子矩阵的和
- 将所有和存入数组,排序后找到中位数
- 遍历所有和,计算与中位数的绝对差,取最小值
Python实现代码框架:
python复制def minAbsoluteDifference(matrix, k):
m, n = len(matrix), len(matrix[0])
sums = []
for i in range(m - k + 1):
for j in range(n - k + 1):
# 计算子矩阵和
sub_sum = 0
for x in range(i, i + k):
for y in range(j, j + k):
sub_sum += matrix[x][y]
sums.append(sub_sum)
sums.sort()
median = sums[len(sums)//2] if len(sums)%2 == 1 else (sums[len(sums)//2-1] + sums[len(sums)//2])/2
min_diff = float('inf')
for s in sums
