308. Range Sum Query 2D - Mutable

class NumMatrix:
    def __init__(self, matrix: List[List[int]]):
        self.matrix = matrix
        
        # self.prefixes[row][index] = sum of prefix array up to and including index
        self.prefixes = []
        # calculate prefix sums per row
        for i, row in enumerate(matrix):
            acc = 0
            prefixes = []
            
            for num in row:
                acc += num
                prefixes.append(acc)
            self.prefixes.append(prefixes)
 
    def update(self, row: int, col: int, val: int) -> None:
        diff = val - self.matrix[row][col]
        self.matrix[row][col] = val
        self.prefixes[row][col] += diff
        for j in range(col+1, len(self.matrix[row])):
            self.prefixes[row][j] += diff
 
    def sumRegion(self, row1: int, col1: int, row2: int, col2: int) -> int:
        ret = 0
        for r in range(row1, row2 + 1):
            row_sum = 0
            if col1 == 0:
                row_sum = self.prefixes[r][col2]
            else:
                row_sum = self.prefixes[r][col2] - self.prefixes[r][col1-1]
            ret += row_sum
        return ret
 
 
# Your NumMatrix object will be instantiated and called as such:
# obj = NumMatrix(matrix)
# obj.update(row,col,val)
# param_2 = obj.sumRegion(row1,col1,row2,col2)
  • use the prefix-sum pattern to reduce the time complexity of sumRegion() from to .
  • update() is slower, from to , but assuming similar rates of each function, I’d rather have two then one .

Categories:: matrix, array, prefix-sum