【LeetCode每日一题】——304.二维区域和检索-矩阵不可变

文章目录

一【题目类别】

  • 矩阵

二【题目难度】

  • 中等

三【题目编号】

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

四【题目描述】

  • 给定一个二维矩阵 matrix,以下类型的多个请求:
    • 计算其子矩形范围内元素的总和,该子矩阵的 左上角 为 (row1, col1) ,右下角 为 (row2, col2) 。
  • 实现 NumMatrix 类:
    • NumMatrix(int\[\]\[\] matrix) 给定整数矩阵 matrix 进行初始化
    • int sumRegion(int row1, int col1, int row2, int col2) 返回左上角 (row1, col1) 、右下角 (row2, col2) 所描述的子矩阵的元素总和。

五【题目示例】

  • 示例 1:
    • 输入:
      • "NumMatrix","sumRegion","sumRegion","sumRegion"

      • \[\[\[3,0,1,4,2\],\[5,6,3,2,1\],\[1,2,0,1,5\],\[4,1,0,1,7\],\[1,0,3,0,5\]\]\],\[2,1,4,3\],\[1,1,2,2\],\[1,2,2,4\]

    • 输出:
      • null, 8, 11, 12

    • 解释:
      • NumMatrix numMatrix = new NumMatrix(\[3,0,1,4,2,5,6,3,2,1,1,2,0,1,5,4,1,0,1,7,1,0,3,0,5]);
      • numMatrix.sumRegion(2, 1, 4, 3); // return 8 (红色矩形框的元素总和)
      • numMatrix.sumRegion(1, 1, 2, 2); // return 11 (绿色矩形框的元素总和)
      • numMatrix.sumRegion(1, 2, 2, 4); // return 12 (蓝色矩形框的元素总和)

六【题目提示】

  • m = = m a t r i x . l e n g t h m == matrix.length m==matrix.length
  • n = = m a t r i x i . l e n g t h n == matrixi.length n==matrixi.length
  • 1 < = m , n < = 200 1 <= m, n <= 200 1<=m,n<=200
  • − 1 0 5 < = m a t r i x i j < = 1 0 5 -10^5 <= matrixij <= 10^5 −105<=matrixij<=105
  • 0 < = r o w 1 < = r o w 2 < m 0 <= row1 <= row2 < m 0<=row1<=row2<m
  • 0 < = c o l 1 < = c o l 2 < n 0 <= col1 <= col2 < n 0<=col1<=col2<n
  • 最多调用 1 0 4 次 s u m R e g i o n 方法 最多调用 10^4 次 sumRegion 方法 最多调用104次sumRegion方法

七【解题思路】

  • 利用前缀和的思想
  • 新建一个二维数组,这个二维数组比原来的二维数组多一列,因为二维数组的每个位置都存储了之前元素的和,故多添加的一列就存储了原来二维数组最后一列的元素及之前值的和,我们只需要按照这个规律遍历填充这个新的二维数组即可
  • 对于传入的二维区域,我们只需要逐行的利用前缀和进行计算求和
  • 最后返回结果即可

八【时间频度】

  • 时间复杂度: O ( m n ) O(mn) O(mn), m 、 n m、n m、n分别为传入的二维数组的行数和列数
  • 空间复杂度: O ( m n ) O(mn) O(mn), m 、 n m、n m、n分别为传入的二维数组的行数和列数

九【代码实现】

  1. Java语言版
java 复制代码
class NumMatrix {

    int[][] sums;

    public NumMatrix(int[][] matrix) {
        int m = matrix.length;
        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 res = 0;
        for(int i = row1;i <= row2;i++){
            res += sums[i][col2 + 1] - sums[i][col1];
        }
        return res;
    }

}
  1. C语言版
c 复制代码
typedef struct 
{
    int** sums;
    int sumsSize;
} NumMatrix;


NumMatrix* numMatrixCreate(int** matrix, int matrixSize, int* matrixColSize) 
{
    int m = matrixSize;
    int n = matrixColSize[0];
    NumMatrix* obj = (NumMatrix*)malloc(sizeof(NumMatrix));
    obj->sums = (int**)malloc(sizeof(int*) * m);
    obj->sumsSize = m;
    for(int i = 0;i < m;i++)
    {
        obj->sums[i] = (int*)malloc(sizeof(int) * (n + 1));
    }
    for(int i = 0;i < m;i++)
    {
        for(int j = 0;j < n;j++)
        {
            obj->sums[i][j + 1] = obj->sums[i][j] + matrix[i][j];
        }
    }
    return obj;
}

int numMatrixSumRegion(NumMatrix* obj, int row1, int col1, int row2, int col2) 
{
    int res = 0;
    for(int i = row1;i <= row2;i++)
    {
        res += obj->sums[i][col2 + 1] - obj->sums[i][col1];
    }
    return res;
}

void numMatrixFree(NumMatrix* obj) 
{
    for(int i = 0;i < obj->sumsSize;i++)
    {
        free(obj->sums[i]);
    }
    free(obj);
}
  1. Python语言版
python 复制代码
class NumMatrix:

    def __init__(self, matrix: List[List[int]]):
        m = len(matrix)
        n = len(matrix[0])
        self.sums = [[0] * (n + 1) for _ in range(m)]
        for i in range(0, m):
            for j in range(0, n):
                self.sums[i][j + 1] = self.sums[i][j] + matrix[i][j]

    def sumRegion(self, row1: int, col1: int, row2: int, col2: int) -> int:
        res = 0
        for i in range(row1, row2 + 1):
            res += self.sums[i][col2 + 1] - self.sums[i][col1]
        return res
  1. C++语言版
cpp 复制代码
class NumMatrix {
public:
    vector<vector<int>> sums;

    NumMatrix(vector<vector<int>>& matrix) {
        int m = matrix.size();
        int n = matrix[0].size();
        sums.resize(m, vector<int>(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];
            }
        }
    }
    
    int sumRegion(int row1, int col1, int row2, int col2) {
        int res = 0;
        for(int i = row1;i <= row2;i++){
            res += sums[i][col2 + 1] - sums[i][col1];
        }
        return res;
    }
};

十【提交结果】

  1. Java语言版

  2. C语言版

  3. Python语言版

  4. C++语言版

相关推荐
Mr.HeBoYan21 分钟前
一次持续三天才出现的丢包故障——深入解析 DPDK Memory Ordering、rte_ring 与 CPU Memory Barrier (下)
linux·网络·算法·架构·dpdk
wabs6661 小时前
关于图论【深度优先搜索的理论基础】
算法·深度优先·图论
皓月斯语1 小时前
【C++基础】三目运算符
开发语言·数据结构·c++
先吃饱再说2 小时前
LeetCode 101. 对称二叉树
算法
是Dream呀2 小时前
人眼看不出的伪造,AI如何识别?实测合合信息跨模态鉴伪与去反光技术
算法
QN1幻化引擎3 小时前
SFA 信号场注意力:用8KB参数换248x KV Cache压缩,边缘设备也能跑长序列
人工智能·算法·gitee·gitlab
剑锋所指,所向披靡!3 小时前
数据结构之拓扑排序
数据结构
段一凡-华北理工大学3 小时前
向量数据库实战:选型、调优与落地~系列文章03:向量相似度算法全解:余弦、欧氏、内积,到底该用哪个?
大数据·数据库·人工智能·算法·机器学习·向量相似度·高炉炼铁
cjr_xyi4 小时前
AT1202Contest_c binarydigit 题解
c语言·c++·算法
atunet5 小时前
从算法优化到系统加速的多层级思考7
算法