思路和一维差不多,二维就是右下代表的总面积减去左边面积减去上边面积,加上多减去的重叠面积。
class NumMatrix {
vector<vector<int>> presum;
public:
NumMatrix(vector<vector<int>>& matrix) {
int m = matrix[0].size();
int n = matrix.size();
vector<vector<int>> psum(n+1, vector<int>(m+1, 0));
for(int i = 0; i < n; i++){
int linesum = 0;
for(int j = 0; j < m; j++){
linesum += matrix[i][j];
psum[i+1][j+1] = psum[i][j+1] + linesum;
}
}
presum = psum;
}
int sumRegion(int row1, int col1, int row2, int col2) {
return presum[row2+1][col2+1] - presum[row2+1][col1] - presum[row1][col2+1] + presum[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);
*/