308 Range Sum Query 2D - Mutable
Given 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
update(3, 2, 2)
sumRegion(2, 1, 4, 3) -> 10Last updated
Given 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
update(3, 2, 2)
sumRegion(2, 1, 4, 3) -> 10Last updated
import numpy as np
class NumMatrix:
def __init__(self, matrix):
"""
initialize your data structure here.
:type matrix: List[List[int]]
"""
self.d = matrix
for row in matrix:
NumMatrix.cum_sum(row)
@staticmethod
def cum_sum(row):
for i in range(1, len(row)):
row[i] += row[i-1]
def update(self, row, col, val):
"""
update the element at matrix[row,col] to val.
:type row: int
:type col: int
:type val: int
:rtype: void
"""
# this is the old cdf
cdf = self.d[row]
# can build pdf from the cdf and properly insert value
prev = 0
pdf = []
for row_elm in cdf:
pdf.append(row_elm - prev)
prev = row_elm
pdf[col] = val
# now update the old pdf
for i in range(1, len(pdf)):
pdf[i] += pdf[i-1]
self.d[row] = pdf
def sumRegion(self, row1, col1, row2, col2):
"""
sum of elements matrix[(row1,col1)..(row2,col2)], inclusive.
:type row1: int
:type col1: int
:type row2: int
:type col2: int
:rtype: int
"""
# integral[5, 10] in discrete -> F[10] - F[5-1]
# but treat this on a 2 dimensional scale
right_sum, left_sum = 0, 0
for i in range(row1, row2+1):
right_sum += self.d[i][col2]
if col1 - 1 >= 0:
for i in range(row1, row2 + 1):
left_sum += self.d[i][col1 - 1]
return right_sum - left_sum
# 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)
obj = NumMatrix([[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]])
print(obj.sumRegion(1,1,3,3))
print(obj.sumRegion(2,2,3,3))
print(obj.update(2,2,100))
print(obj.sumRegion(2,2,3,3))