304. Range Sum Query 2D Immutable - cocoder39/coco39_LC GitHub Wiki
304. Range Sum Query 2D - Immutable
class NumMatrix:
def __init__(self, matrix: List[List[int]]):
m, n = len(matrix), len(matrix[0])
self.region = [[0 for _ in range(n)] for _ in range(m)]
r = 0
for j in range(n):
self.region[0][j] = r + matrix[0][j]
r = self.region[0][j]
r = 0
for i in range(m):
self.region[i][0] = r + matrix[i][0]
r = self.region[i][0]
for i in range(1, m):
for j in range(1, n):
self.region[i][j] = self.region[i][j-1] + self.region[i-1][j] + matrix[i][j] - self.region[i-1][j-1]
def sumRegion(self, row1: int, col1: int, row2: int, col2: int) -> int:
region1 = self.region[row2][col2]
region2 = self.region[row1-1][col1-1] if row1 >= 1 and col1 >= 1 else 0
region3 = self.region[row2][col1-1] if col1 >= 1 else 0
region4 = self.region[row1-1][col2] if row1 >= 1 else 0
return region1 - region3 - region4 + region2
a dummy row and col to make the code clean
class NumMatrix:
def __init__(self, matrix: List[List[int]]):
m, n = len(matrix), len(matrix[0])
self.region = [[0 for _ in range(n+1)] for _ in range(m+1)]
for i in range(1, m+1):
for j in range(1, n+1):
self.region[i][j] = self.region[i][j-1] + self.region[i-1][j] + matrix[i-1][j-1] - self.region[i-1][j-1]
def sumRegion(self, row1: int, col1: int, row2: int, col2: int) -> int:
return self.region[row2+1][col2+1] + self.region[row1][col1] - self.region[row2+1][col1] - self.region[row1][col2+1]
=======================================================================
class NumMatrix {
public:
NumMatrix(vector<vector<int>> &matrix) {
int m = matrix.size();
if (m == 0) {
return;
}
int n = matrix[0].size();
//sums[i][j] is [0][0] to [i - 1][j - 1]
sums = vector<vector<int>>(m + 1, vector<int>(n + 1));
for (int i = 1; i <= m; i++) {
for (int j = 1; j <= n; j++) {
sums[i][j] = sums[i - 1][j] + sums[i][j - 1] - sums[i - 1][j - 1] + matrix[i - 1][j - 1];
}
}
}
int sumRegion(int row1, int col1, int row2, int col2) {
return sums[row2 + 1][col2 + 1] - sums[row1][col2 + 1] - sums[row2 + 1][col1] + sums[row1][col1];
}
private:
vector<vector<int>> sums;
};