[每日一刷] (Range Sum Query 2D Immutable)
Given a 2D matrix matrix, find the sum of the elements inside the rectangle defined by its upper left corner (row1, col1) and lower right corner (row2, col2).
Example: 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 sumRegion(1, 1, 2, 2) -> 11 sumRegion(1, 2, 2, 4) -> 12
解题思路 这题思路和一维的时候一致,可以使用动态规划也可以使用线段树。就这题来说使用动态规划会简单很多。
思路就是用dp[i][j]表示从(0, 0)到(i, j)的和
Python: 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
"""
时间复杂度 Query O(1), Build O(n^2)
"""
class NumMatrix (object) :
def __init__ (self, matrix) :
"""
initialize your data structure here.
:type matrix: List[List[int]]
"""
if matrix == []:
return
r = len(matrix)
c = len(matrix[0 ])
self.dp = [[0 for i in xrange(c+1 )] for j in xrange(r+1 )]
for i in xrange(1 , r+1 ):
for j in xrange(1 , c+1 ):
self.dp[i][j] = self.dp[i-1 ][j] + self.dp[i][j-1 ] - self.dp[i-1 ][j-1 ] + matrix[i-1 ][j-1 ]
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
"""
return self.dp[row2+1 ][col2+1 ] - self.dp[row1][col2+1 ] - self.dp[row2+1 ][col1] + self.dp[row1][col1]