range sum query 2d
上圖子矩陣左上角 (row1, col1) = (2, 1) ,右下角(row2, col2) = (4, 3),該子矩形內元素的總和為 8。
示例:給定 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
說明:你可以假設矩陣不可變。
會多次呼叫 sumregion 方法。
你可以假設 row1 ≤ row2 且 col1 ≤ col2。
在真實的面試中遇到過這道題?
dp1:
class nummatrix:
def __init__(self, matrix):
r=len(matrix)
if not r:
return
c=len(matrix[0])
self.dp=matrix
for i in range(r):
for j in range(1,c):
self.dp[i][j]=self.dp[i][j-1]+self.dp[i][j] #dp[i][j]記錄矩陣第i行[0,j]序列的長度
print(self.dp)
def sumregion(self, row1: int, col1: int, row2: int, col2: int) -> int:
res=0
for row in range(row1,row2+1):
res+=self.dp[row][col2]
if col1>0:
res-=self.dp[row][col1-1]
return res
dp2:
dp[i][j]記錄(0,0)到(i,j)矩形的元素和,sumregion函式利用幾何運算o(1)時間算出結果。
class nummatrix:
def __init__(self, matrix):
# for x in matrix:
# print(x)
# print('')
if not len(matrix) or not len(matrix[0]):
return
self.dp=[[0 for i in range(len(matrix[0])+1)] for j in range(len(matrix)+1)]
#dp[i+1][j+1]記錄(0,0)左上角和(i,j)右下角構成矩形的元素和
for row in range(1,len(self.dp)):
for col in range(1,len(self.dp[0])):
self.dp[row][col]=self.dp[row-1][col]+self.dp[row][col-1]+matrix[row-1][col-1]-self.dp[row-1][col-1]
# for x in self.dp:
# print(x)
def sumregion(self, row1: int, col1: int, row2: int, col2: int) -> int:
return self.dp[row2+1][col2+1]-self.dp[row2+1][col1]-self.dp[row1][col2+1]+self.dp[row1][col1]
304 二維區域和檢索 矩陣不可變
題目描述 給定乙個二維矩陣,計算其子矩形範圍內元素的總和,該子矩陣的左上角為 row1,col1 右下角為 row2,col2 30 1425 6321 1201 5410 1710 305 上圖子矩陣左上角 row1,col1 2,1 右下角 row2,col2 4,3 該子矩形內元素的總和為 8...
304 二維區域和檢索 矩陣不可變
給定乙個二維矩陣,計算其子矩形範圍內元素的總和,該子矩陣的左上角為 row1,col1 右下角為 row2,col2 上圖子矩陣左上角 row1,col1 2,1 右下角 row2,col2 4,3 該子矩形內元素的總和為 8。示例 給定 matrix 3,0,1,4,2 5,6,3,2,1 1,2...
304 二維區域和檢索 矩陣不可變
leetcode所記錄的執行時間沒有包含 或者只是包含一次 初始化的時間 這是因為題目中已經說明了矩陣不可變,並且是多次呼叫sumregion 方法。1.暴力求解,1396ms,16.6mb class nummatrix def init self,matrix list list int sel...