程式語言 - LeetCode - C++ - 304. Range Sum Query 2D - Immutable



題目:


方法:

建表公式
prefix[i][j] =
    prefix[i − 1][j + 0] +
    prefix[i + 0][j − 1] − 
    prefix[i − 1][j − 1] +
    matrix[i − 1][j − 1]

查詢公式
sumRegion =
    prefix[r2 + 1][c2 + 1] −
    prefix[r1 + 0][c2 + 1] − 
    prefix[r2 + 1][c1 + 0] +
    prefix[r1 + 0][c1 + 0]

解答:

class NumMatrix {
private:
    vector<vector<int>> sum;

public:
    NumMatrix(vector<vector<int>>& matrix) {
        int m = matrix.size();
        int n = matrix[0].size();

        sum.resize(m + 1, vector<int>(n + 1, 0));

        for (int i = 1; i <= m; ++i) {
            for (int j = 1; j <= n; ++j) {
                sum[i][j] = 
                    sum[i - 1][j] +
                    sum[i][j - 1] -
                    sum[i - 1][j - 1] +
                    matrix[i - 1][j - 1];
            }
        }
    }
    
    int sumRegion(int row1, int col1, int row2, int col2) {
        return sum[row2 + 1][col2 + 1] -
            sum[row1][col2 + 1] -
            sum[row2 + 1][col1] +
            sum[row1][col1];
    }
};

/**
 * Your NumMatrix object will be instantiated and called as such:
 * NumMatrix* obj = new NumMatrix(matrix);
 * int param_1 = obj->sumRegion(row1,col1,row2,col2);
 */