1. 程式人生 > 實用技巧 >405. 和為零的子矩陣(經典)

405. 和為零的子矩陣(經典)

405.和為零的子矩陣

中文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軸)

class
Solution: """ @param: matrix: an integer matrix @return: the coordinate of the left-up and right-down number """ def submatrixSum(self, matrix): # write your code here #字首和寫法,記錄豎向前綴和,然和橫向相加 len_x, len_y = len(matrix), len(matrix[0]) #固定第一個x軸座標
for i in range(len_x): #第一個從第一行往下遍歷尋找 array = [0 for _ in range(len_y)] #內層迴圈,第二個座標(固定第二個x軸座標) for j in range(i, len_x): #在i到j中間,求得第二個座標的字首和 - 第一個座標的字首和即為當前該矩陣的子陣列和 prefixsum_hash = {0: -1} #每次都需要更新字首和,每個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