原题指路
题目描述
给定一个二维矩阵,计算其子矩形范围内元素的总和,该子矩阵的左上角为 (row1, col1)
,右下角为 (row2, col2)
。
解题思路
虽然这道题变成了对二维数组求解,但和之前做的区域和检索本质上并没有区别。因为都可以对数组进行预处理,所以仍然可以采用前缀和的思路。不过这次可以采用二维前缀和。
定义
s
u
m
[
i
+
1
]
[
j
+
1
]
=
s
u
m
[
i
]
[
j
+
1
]
+
s
u
m
[
i
+
1
]
[
j
]
−
s
u
m
[
i
]
[
j
]
+
m
a
t
r
i
x
[
i
]
[
j
]
sum[i + 1][j + 1] = sum[i][j + 1] + sum[i + 1][j] - sum[i][j] + matrix[i][j]
sum[i+1][j+1]=sum[i][j+1]+sum[i+1][j]−sum[i][j]+matrix[i][j],则区域和可以表示为
s
u
m
[
r
o
w
2
+
1
]
[
c
o
l
2
+
1
]
−
s
u
m
[
r
o
w
2
+
1
]
[
c
o
l
1
]
−
s
u
m
[
r
o
w
1
]
[
c
o
l
2
+
1
]
+
s
u
m
[
r
o
w
1
]
[
c
o
l
1
]
sum[row2 + 1][col2 + 1] - sum[row2 + 1][col1] - sum[row1][col2 + 1] + sum[row1][col1]
sum[row2+1][col2+1]−sum[row2+1][col1]−sum[row1][col2+1]+sum[row1][col1]
时间复杂度:
O
(
m
n
)
O(mn)
O(mn)
空间复杂度:
O
(
m
n
)
O(mn)
O(mn)
其中,m、n分别为矩阵的行数以及列数。
代码
class NumMatrix:
def __init__(self, matrix: List[List[int]]):
if not matrix or not matrix[0]:
M, N = 0, 0
else:
M, N = len(matrix), len(matrix[0])
self.sum = [[0] * (N + 1) for _ in range(M + 1)]
for i in range(M):
for j in range(N):
self.sum[i + 1][j + 1] = self.sum[i][j + 1] + self.sum[i + 1][j] - self.sum[i][j] + matrix[i][j]
def sumRegion(self, row1: int, col1: int, row2: int, col2: int) -> int:
return self.sum[row2 + 1][col2 + 1] - self.sum[row2 + 1][col1] - self.sum[row1][col2 + 1] + self.sum[row1][col1]
# Your NumMatrix object will be instantiated and called as such:
# obj = NumMatrix(matrix)
# param_1 = obj.sumRegion(row1,col1,row2,col2)