Leetcode-304. 二维区域和检索 - 矩阵不可变
给定一个二维矩阵,计算其子矩形范围内元素的总和,该子矩阵的左上角为 (row1, col1) ,右下角为 (row2, col2)。
示例:
给定 matrix = [
[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]
]
sumRegion(2, 1, 4, 3) -> 8
sumRegion(1, 1, 2, 2) -> 11
sumRegion(1, 2, 2, 4) -> 12
说明:
你可以假设矩阵不可变。
会多次调用 sumRegion 方法。
你可以假设 row1 ≤ row2 且 col1 ≤ col2。
思路:
定义一个dp矩阵,其中第(i,j)位置用来存放matrix中从(0,0)位置开始到(i,j)的和。然后可以根据dp[row2][col2]+dp[row1-1][col1-1]-dp[row1-1][col2]-dp[row2][col1-1] ,求出(row1,col1)到(row2,col2)之间的和。
C++ code:
class NumMatrix {
private:
vector<vector<int>> dp;
public:
NumMatrix(vector<vector<int>>& matrix) {
if(matrix.empty()){
return;
}
dp = matrix;
int rows = matrix.size();
int cols = matrix[0].size();
for(int row = 1; row < rows; row++){
dp[row][0] += dp[row-1][0];
}
for(int col = 1; col < cols; col++){
dp[0][col] += dp[0][col-1];
}
for(int row = 1; row < rows; row++){
for(int col = 1; col < cols; col++){
dp[row][col] = dp[row-1][col] + dp[row][col-1] - dp[row-1][col-1] + matrix[row][col];
}
}
}
int sumRegion(int row1, int col1, int row2, int col2) {
if(dp.empty()){
return 0;
}
if(row1 == 0 && col1 == 0){
return dp[row2][col2];
}
if(row1 == 0){
return dp[row2][col2] - dp[row2][col1 -1];
}
if(col1 == 0){
return dp[row2][col2] - dp[row1 - 1][col2];
}
return dp[row2][col2]+dp[row1-1][col1-1]-dp[row1-1][col2]-dp[row2][col1-1];
}
};
/**
* Your NumMatrix object will be instantiated and called as such:
* NumMatrix* obj = new NumMatrix(matrix);
* int param_1 = obj->sumRegion(row1,col1,row2,col2);
*/