中文english
給定乙個整數矩陣,請找出乙個子矩陣,使得其數字之和等於0.輸出答案時,請返回左上數字和右下數字的座標。
如果有多個答案, 你可以返回其中任意乙個.
樣例 1:
輸入:
[ [1, 5, 7],
[3, 7, -8],
[4, -8 ,9]
]輸出: [[1, 1], [2, 2]]
樣例 2:
輸入:
[ [0, 1],
[1, 0]
]輸出: [[0, 0], [0, 0]]
o(n3) 時間複雜度。
輸入測試資料 (每行乙個引數)如何理解測試資料?
字首和 (i到j中間求字首和,x軸)
#字首和寫法,記錄豎向字首和,然和橫向相加
len_x, len_y = len(matrix), len(matrix[0
])
#固定第乙個x軸座標
for i in
range(len_x):
#第乙個從第i行往下遍歷尋找,儲存的是i到j行中間得第z個字首和
array = [0
for _ in
range(len_y)]
#內層迴圈,第二個座標(固定第二個x軸座標)
for j in
range(i, len_x):
#在i到j中間,求得第二個座標的字首和 -第乙個座標的字首和即為當前該矩陣的子陣列和
prefixsum_hash =
#每次都需要更新字首和,每個y軸座標,需要取出所有相對應座標的字首和,所以需要在裡面更新
prefixsum = 0
for z in
range(len_y):
#求當前第乙個座標i和第二個座標j,的第z個豎向字首和(i >j 橫向座標裡面的第z個豎向和)
array[z] +=matrix[j][z]
#加上豎向字首和,依次加便是前i到j行,前z列(包含j列)的字首和
prefixsum +=array[z]
#如果之前已經記錄過prefixsum的話,則返回第二個座標
if (prefixsum in
prefixsum_hash):
#前z個,但是要返回的是z +1開始的縱座標(第乙個)
return [(i, prefixsum_hash[prefixsum] + 1
), (j, z)]
#記錄下來,如果之前不存在該字首和的話,只需要記錄縱座標即可,橫座標的時候在上面會迴圈判斷取
prefixsum_hash[prefixsum] =z
#如果最終仍沒有則返回none
return none
796 子矩陣的和
輸入乙個n行m列的整數矩陣,再輸入q個詢問,每個詢問包含四個整數x1,y1,x2,y2,表示乙個子矩陣的左上角座標和右下角座標。對於每個詢問輸出子矩陣中所有數的和。第一行包含三個整數n,m,q。接下來n行,每行包含m個整數,表示整數矩陣。接下來q行,每行包含四個整數x1,y1,x2,y2,表示一組詢...
字首和與子矩陣的和
一維字首和 s i a 1 a 2 a i a l a r s r s l 1 二維字首和 s i,j 第i行j列格仔左上部分所有元素的和 以 x1,y1 為左上角,x2,y2 為右下角的子矩陣的和為 s x2,y2 s x1 1,y2 s x2,y1 1 s x1 1,y1資料來自acwing 題...
子矩陣的最大累加和
題目 給定乙個矩陣matrix,其中的值有正 有負 有零,返回子矩陣的最大累加和。例如矩陣matrix為 90 48 78 64 40 64 81 7 66 其中,最大累加和的子矩陣為 48 78 40 64 7 66 所以返回子矩陣的最大累加和為209。解析 最簡單也最容易想到的方法是求出矩陣中的...