카테고리 없음
[LeetCode with Python] 304. Range Sum Query 2D - Immutable
papajohns
2020. 7. 6. 23:57
Difficulty : Medium
1st Approach : use sement tree -> too slow
from typing import List
class NumMatrix:
def __init__(self, matrix: List[List[int]]):
self.matrix = matrix
self.row_M = len(matrix)
self.col_N = len(matrix[0]) if matrix else 0
self.tree = [[0] * (self.col_N * 4) for _ in range(self.row_M)]
for i in range(self.row_M):
self.init_tree(i)
def init_tree(self, row: int) -> None:
for key, value in enumerate(self.matrix[row]):
self.update(row, 1, 0, self.col_N - 1, key, value)
def update(self, row: int, node: int, start: int, end: int, index: int, diff: int) -> None:
if index < start or end < index:
return
self.tree[row][node] += diff
if start == end:
return
mid = (start + end) // 2
self.update(row, node * 2, start, mid, index, diff)
self.update(row, node * 2 + 1, mid + 1, end, index, diff)
def sumRegion(self, row1: int, col1: int, row2: int, col2: int) -> int:
sum_ = 0
for i in range(row1, row2 + 1):
sum_ += self.sum_row(i, 1, 0, self.col_N - 1, col1, col2)
return sum_
def sum_row(self, row: int, node: int, start: int, end: int, range_left: int, range_right: int) -> int:
if range_right < start or end < range_left:
return 0
if range_left <= start and end <= range_right:
return self.tree[row][node]
mid = (start + end) // 2
return self.sum_row(row, node * 2, start, mid, range_left, range_right) +\
self.sum_row(row, node * 2 + 1, mid + 1, end, range_left, range_right)
if __name__ == '__main__':
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]
]
sol = NumMatrix(matrix)
print(sol.sumRegion(2, 1, 4, 3))
print(sol.sumRegion(1, 1, 2, 2))
print(sol.sumRegion(1, 2, 2, 4))