【Leetcode】304. Range Sum Query 2D - Immutable

题目地址:

https://leetcode.com/problems/range-sum-query-2d-immutable/

给定一个二维矩阵AA,要求设计一个数据结构,可以实现查询左上从(r1,c1)(r_1,c_1),右下到(r2,c2)(r_2,c_2)范围内矩阵数字的和的操作。

思路是前缀和。令f[i][j]f[i][j]是原矩阵位于前ii行前jj列的所有数字的和,规定f[0][j]=f[i][0]=0f[0][j]=f[i][0]=0,那么有f[i][j]=A[i][j]+f[i1][j]+f[i][j1]f[i1][j1]f[i][j]=A[i][j]+f[i-1][j]+f[i][j-1]-f[i-1][j-1]查询的时候,利用前缀和做差即可。代码如下:

public class NumMatrix {
    
    private int[][] prefixSum;
    
    public NumMatrix(int[][] matrix) {
        if (matrix == null || matrix.length == 0 || matrix[0].length == 0) {
            return;
        }
        
        int n = matrix.length, m = matrix[0].length;
        prefixSum = new int[n + 1][m + 1];
        for (int i = 1; i <= n; i++) {
            for (int j = 1; j <= m; j++) {
                prefixSum[i][j] = matrix[i - 1][j - 1] + prefixSum[i - 1][j] + prefixSum[i][j - 1] - prefixSum[i - 1][j - 1];
            }
        }
    }

	public int sumRegion(int row1, int col1, int row2, int col2) {
        return prefixSum[row2 + 1][col2 + 1] - prefixSum[row2 + 1][col1] - prefixSum[row1][col2 + 1] + prefixSum[row1][col1];
    }
}

初始化时空复杂度O(nm)O(nm),查询时空复杂度O(1)O(1)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章