304. Range Sum Query 2D - Immutable
class NumMatrix {
private:
vector<vector<int> > pre;
int mm, nn;
public:
NumMatrix(vector<vector<int>> &matrix) {
mm = matrix.size();
if (mm == 0) return;
nn = matrix[0].size();
pre.resize(mm);
for (int i = 0; i < mm; i++) pre[i].resize(nn);
vector<int> sum(nn + 1, 0);
for (int i = 0; i < mm; i++) {
sum[0] = 0;
for (int j = 0; j < nn; j++) {
//update sum
sum[j + 1] = sum[j] + matrix[i][j];
if (i == 0) {
pre[i][j] = sum[j + 1];
} else {
pre[i][j] = pre[i - 1][j] + sum[j + 1];
}
}
}
}
int sumRegion(int row1, int col1, int row2, int col2) {
if (row1 > row2 || col1 > col2) return 0;
int aa = 0, bb = 0, cc = 0;
if (col1 >= 1) {
aa = pre[row2][col1 - 1];
}
if (row1 >= 1) {
bb = pre[row1 - 1][col2];
}
if (row1 >= 1 && col1 >= 1) {
cc = pre[row1 - 1][col1 - 1];
}
return pre[row2][col2] - aa - bb + cc;
//return pre[row2][col2] - pre[row2][col1 - 1] - pre[row1 - 1][col2] + pre[row1 - 1][col1 - 1];
}
};
// Your NumMatrix object will be instantiated and called as such:
// NumMatrix numMatrix(matrix);
// numMatrix.sumRegion(0, 1, 2, 3);
// numMatrix.sumRegion(1, 2, 3, 4);
303. Range Sum Query - Immutable
“`cpp
class NumArray {
private:
vector sums;
public:
NumArray(vector nums) {
sums.push_back(0);
for (int i = 1; i <= nums.size(); i++) sums.push_back(sums.back() + nums[i - 1]);
}
int sumRange(int i, int j) {
return sums[j + 1] - sums[i];
}
};
/**
* Your NumArray object will be instantiated and called as such:
* NumArray obj = new NumArray(nums);
* int param_1 = obj.sumRange(i,j);
*/
“`