0
点赞
收藏
分享

微信扫一扫

springboot狱内罪犯危险性评估系统的设计与实现论文源码调试讲解

生态人 2024-08-13 阅读 27

304. Range Sum Query 2D - Immutable

Given a 2D matrix matrix, handle multiple queries of the following type:

  • Calculate the sum of the elements of matrix inside the rectangle defined by its upper left corner (row1, col1) and lower right corner (row2, col2).

Implement the NumMatrix class:

  • NumMatrix(int[][] matrix) Initializes the object with the integer matrix matrix.
  • int sumRegion(int row1, int col1, int row2, int col2) Returns the sum of the elements of matrix inside the rectangle defined by its upper left corner (row1, col1) and lower right corner (row2, col2).

You must design an algorithm where sumRegion works on O(1) time complexity.
 

Example 1:

在这里插入图片描述

Constraints:
  • m == matrix.length
  • n == matrix[i].length
  • 1 <= m, n <= 200
  • − 1 0 4 < = m a t r i x [ i ] [ j ] < = 1 0 4 -10^4 <= matrix[i][j] <= 10^4 104<=matrix[i][j]<=104
  • 0 <= row1 <= row2 < m
  • 0 <= col1 <= col2 < n
  • At most 104 calls will be made to sumRegion.

From: LeetCode
Link: 304. Range Sum Query 2D - Immutable


Solution:

Ideas:
  • numMatrixCreate: Initializes the NumMatrix object and creates the 2D prefix sum array.
  • numMatrixSumRegion: Computes the sum of the elements within the specified submatrix using the 2D prefix sum array.
  • numMatrixFree: Frees the allocated memory for the NumMatrix object.
Code:
typedef struct {
    int** prefixSum;
    int rows;
    int cols;
} NumMatrix;

NumMatrix* numMatrixCreate(int** matrix, int matrixSize, int* matrixColSize) {
    if (matrixSize == 0 || matrixColSize[0] == 0) {
        return NULL;
    }
    
    NumMatrix* obj = (NumMatrix*)malloc(sizeof(NumMatrix));
    obj->rows = matrixSize;
    obj->cols = matrixColSize[0];
    
    obj->prefixSum = (int**)malloc((obj->rows + 1) * sizeof(int*));
    for (int i = 0; i <= obj->rows; ++i) {
        obj->prefixSum[i] = (int*)calloc((obj->cols + 1), sizeof(int));
    }
    
    for (int i = 1; i <= obj->rows; ++i) {
        for (int j = 1; j <= obj->cols; ++j) {
            obj->prefixSum[i][j] = matrix[i-1][j-1]
                                 + obj->prefixSum[i-1][j]
                                 + obj->prefixSum[i][j-1]
                                 - obj->prefixSum[i-1][j-1];
        }
    }
    
    return obj;
}

int numMatrixSumRegion(NumMatrix* obj, int row1, int col1, int row2, int col2) {
    if (!obj) {
        return 0;
    }
    
    return obj->prefixSum[row2+1][col2+1]
         - obj->prefixSum[row1][col2+1]
         - obj->prefixSum[row2+1][col1]
         + obj->prefixSum[row1][col1];
}

void numMatrixFree(NumMatrix* obj) {
    if (obj) {
        for (int i = 0; i <= obj->rows; ++i) {
            free(obj->prefixSum[i]);
        }
        free(obj->prefixSum);
        free(obj);
    }
}

/**
 * Your NumMatrix struct will be instantiated and called as such:
 * NumMatrix* obj = numMatrixCreate(matrix, matrixSize, matrixColSize);
 * int param_1 = numMatrixSumRegion(obj, row1, col1, row2, col2);
 * numMatrixFree(obj);
 */
举报

相关推荐

0 条评论