【LeetCode-剑指offer】-- 13.二维区域和检索-矩阵不可变

13.二维区域和检索-矩阵不可变

方法:一维前缀和

初始化时对矩阵的每一行计算前缀和,检索时对二维区域中的每一行计算子数组和,然后对每一行的子数组和计算总和。

具体实现方面,创建 m 行 n+1 列的二维数组 sums,其中 m和 n 分别是矩阵 matrix 的行数和列数,sumsi为 matrixi 的前缀和数组。将 sums 的列数设为 n+1 的目的是为了方便计算每一行的子数组和,不需要对 col1=0的情况特殊处理。

java 复制代码
class NumMatrix {
    int[][] sums;
    public NumMatrix(int[][] matrix) {
        int m = matrix.length;
        if(m > 0){
            int n = matrix[0].length;
            sums = new int[m][n+1];
            for(int i = 0;i<m;i++){
                for(int j = 0;j<n;j++){
                    //对二维区域中每一行计算子数组和,对每一行的子数组计算总和
                    sums[i][j+1] = sums[i][j] + matrix[i][j];
                }
            }
        }
    }
    
    public int sumRegion(int row1, int col1, int row2, int col2) {
        int sum = 0;
        for(int i = row1;i<=row2;i++){
            sum += sums[i][col2+1] - sums[i][col1];
        }
        return sum;
    }
}

/**
 * Your NumMatrix object will be instantiated and called as such:
 * NumMatrix obj = new NumMatrix(matrix);
 * int param_1 = obj.sumRegion(row1,col1,row2,col2);
 */
相关推荐
唐墨1235 小时前
linux kernel 比较数据大小的宏定义
linux·算法
拂拉氏5 小时前
【知识讲解-题目讲解】 统计满足K约束的子字符串数量2 (滑动窗口+前缀和+二分查找+分析)
算法·前缀和·二分查找·滑动窗口
通信小呆呆10 小时前
电子战抗干扰技术:当“不被干扰”成为一种系统
算法·通信·mimo·isac
笑容掩饰我的失落10 小时前
区块链从小白到精通(八):从零实现一个标准 ERC-20 代币(完整可运行代码)
算法·区块链·php·智能合约·哈希算法
Severus_black11 小时前
【C++初阶】Stack、Queue算法题大练兵!
c语言·c++·算法·stl
2601_9679791213 小时前
机器学习必修课:经典算法与Python实战
python·算法·机器学习·实战·课程
程序猿打工仔13 小时前
计算机基础(C语言)考编、专技岗
c语言·开发语言·算法
通信小呆呆14 小时前
电子战干扰技术:从“蛮力压制”到“精准欺骗”,再到“认知博弈”
算法·通信·isac
老师我太想进步了202614 小时前
【数据结构-6】算法美学之单链表(1)
数据结构·算法
希望我万事顺遂15 小时前
力扣hot100-滑动窗口最大值
数据结构·算法·leetcode