【中等】力扣算法题解析LeetCode308:二维区域和检索-矩阵可修改

关注文末推广名片,即可免费获得本题测试源码

题目来源:🔒308:二维区域和检索-矩阵可修改

问题抽象: 设计一个类 NumMatrix,用于高效处理 动态二维整数矩阵的任意子矩阵和查询与单点修改,满足以下核心需求:

  1. 类功能定义

    • 初始化:接收二维整数矩阵 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) 为右下角的矩形区域元素和(包含边界)。
  2. 操作约束

    • 初始化效率:构造函数时间复杂度 O(mn)(允许预处理,m×n 为矩阵尺寸);
    • 更新高效update 方法时间复杂度 O(log m × log n)(避免重构全矩阵);
    • 查询高效sumRegion 方法时间复杂度 O(log m × log n)(避免扫描子矩阵);
    • 空间复杂度 O(mn):额外存储结构尺寸与输入矩阵相当。
  3. 输入输出

    • 输入矩阵 matrix:尺寸 m×n1 ≤ 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
    • 输出:区域和(整数)。
  4. 边界处理

    • 空矩阵m=0n=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);  // 区域和查询  
}  

应用场景:实时更新的网格数据统计(如动态图表、游戏地图状态监控)。


解题思路

核心问题:在动态更新的二维矩阵中高效计算任意矩形区域的和,需同时优化 updatesumRegion 操作的时间复杂度。

算法选型:二维树状数组(Binary Indexed Tree)

  • 为什么选择树状数组?
    传统二维前缀和在更新时需要 O(mn) 时间重建,不适用于频繁更新场景。树状数组支持:

    • 单点更新:时间复杂度 O(log m * log n)
    • 区间求和:时间复杂度 O(log m * log n)
      适合本题更新和查询均匀调用的场景。
  • 二维树状数组原理

    1. 数据结构:维护一个二维数组 tree,其中 tree[i][j] 存储从 (i - lowbit(i) + 1, j - lowbit(j) + 1)(i, j) 的矩形区域
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

达文汐

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值