405 和為零的子矩陣 經典

2022-02-14 21:23:27 字數 1726 閱讀 4472

中文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。解析 最簡單也最容易想到的方法是求出矩陣中的...