1. 问题背景与核心思路
这个问题要求我们计算一个矩阵中所有特定尺寸子矩阵的"价值"之和。这里的"价值"定义为子矩阵中最大值与最小值的乘积。直接暴力计算每个子矩阵的最大值和最小值显然不可行,因为时间复杂度会高达O(nmab),在n和m较大时根本无法承受。
1.1 降维思想的应用
解决这个问题的关键在于将二维问题分解为两次一维处理:
- 首先处理每一行,计算该行上所有长度为b的滑动窗口的最大值和最小值
- 然后处理每一列,在第一步结果的基础上计算高度为a的滑动窗口的最大值和最小值
这种分步处理的方法将O(nmab)的时间复杂度降低到了O(nm),是一个巨大的优化。
1.2 单调队列的作用
单调队列是解决滑动窗口最值问题的高效数据结构。它可以在O(1)均摊时间内获取当前窗口的最值,使得整个算法的时间复杂度保持在线性水平。
提示:单调队列之所以高效,是因为它维护了一个按特定顺序排列的队列,可以快速排除不可能成为最值的元素。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 详细实现步骤解析
2.1 第一阶段:行方向处理
cpp复制for(int i=1;i<=n;i++){
deque<int> q1, q2;
for(int j=1;j<=m;j++){
// 处理最大值队列
while(!q1.empty() && A[i][q1.back()] <= A[i][j]) q1.pop_back();
q1.push_back(j);
if(q1.front() <= j-b) q1.pop_front();
// 处理最小值队列
while(!q2.empty() && A[i][q2.back()] >= A[i][j]) q2.pop_back();
q2.push_back(j);
if(q2.front() <= j-b) q2.pop_front();
// 记录结果
if(j>=b){
rowMax[i][j-b+1] = A[i][q1.front()];
rowMin[i
