题目来源:🔒308:二维区域和检索-矩阵可修改
问题抽象: 设计一个类 NumMatrix,用于高效处理 动态二维整数矩阵的任意子矩阵和查询与单点修改,满足以下核心需求:
-
类功能定义:
- 初始化:接收二维整数矩阵
matrix并构建支持动态操作的数据结构; - 更新方法:
update(int row, int col, int val)将matrix[row][col]的值修改为val; - 查询方法:
sumRegion(int row1, int col1, int row2, int col2)返回以(row1, col1)为左上角、(row2, col2)为右下角的矩形区域元素和(包含边界)。
- 初始化:接收二维整数矩阵
-
操作约束:
- 初始化效率:构造函数时间复杂度 O(mn)(允许预处理,
m×n为矩阵尺寸); - 更新高效:
update方法时间复杂度 O(log m × log n)(避免重构全矩阵); - 查询高效:
sumRegion方法时间复杂度 O(log m × log n)(避免扫描子矩阵); - 空间复杂度 O(mn):额外存储结构尺寸与输入矩阵相当。
- 初始化效率:构造函数时间复杂度 O(mn)(允许预处理,
-
输入输出:
- 输入矩阵
matrix:尺寸m×n(1 ≤ m, n ≤ 200),元素值-10^5 ≤ matrix[i][j] ≤ 10^5; - 更新参数:
0 ≤ row < m,0 ≤ col < n,新值val(整数); - 查询参数:
0 ≤ row1 ≤ row2 < m,0 ≤ col1 ≤ col2 < n; - 输出:区域和(整数)。
- 输入矩阵
-
边界处理:
- 空矩阵:
m=0或n=0时,更新/查询操作仍可执行(返回0或无操作); - 单点更新后查询:如
update(0,0,5)后sumRegion(0,0,0,0)返回5; - 大区域查询:如
sumRegion(0,0,m-1,n-1)返回矩阵总和; - 高频操作:支持
10^4次更新和查询操作(总调用次数上限)。
- 空矩阵:
类接口定义:
class NumMatrix {
public NumMatrix(int[][] matrix); // 初始化
public void update(int row, int col, int val); // 单点修改
public int sumRegion(int row1, int col1, int row2, int col2); // 区域和查询
}
应用场景:实时更新的网格数据统计(如动态图表、游戏地图状态监控)。
解题思路
核心问题:在动态更新的二维矩阵中高效计算任意矩形区域的和,需同时优化 update 和 sumRegion 操作的时间复杂度。
算法选型:二维树状数组(Binary Indexed Tree)
-
为什么选择树状数组?
传统二维前缀和在更新时需要O(mn)时间重建,不适用于频繁更新场景。树状数组支持:- 单点更新:时间复杂度
O(log m * log n)。 - 区间求和:时间复杂度
O(log m * log n)。
适合本题更新和查询均匀调用的场景。
- 单点更新:时间复杂度
-
二维树状数组原理:
- 数据结构:维护一个二维数组
tree,其中tree[i][j]存储从(i - lowbit(i) + 1, j - lowbit(j) + 1)到(i, j)的矩形区域
- 数据结构:维护一个二维数组

最低0.47元/天 解锁文章
8万+

被折叠的 条评论
为什么被折叠?



