給出矩陣 matrix 和目標值 target,返回元素總和等於目標值的非空子矩陣的數量。
子矩陣 x1, y1, x2, y2 是滿足 x1 <= x <= x2 且 y1 <= y <= y2 的所有單元 matrix[x][y] 的集合。
如果 (x1, y1, x2, y2) 和 (x1’, y1’, x2’, y2’) 兩個子矩陣中部分座標不同(如:x1 != x1’),那麼這兩個子矩陣也不同。
來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/number-of-submatrices-that-sum-to-target
著作權歸領釦網絡所有。商業轉載請聯繫官方授權,非商業轉載請註明出處。
——————————
解題思路:
(1)對於一個rows行,cols列的矩陣,計算每一行的前綴和,得到一個基於行的前綴和矩陣。
(2)基於列對前綴和矩陣進行劃分,對於有cols列的前綴和矩陣,不同列的組合有cols*(cols-1)種,將不同列的值累加到同一列中,這樣就從二維矩陣變爲一維的矩陣,然後利用字典的方法來統計不同子矩陣的數量。
class Solution:
def numSubmatrixSumTarget(self, matrix: List[List[int]], target: int) -> int:
# 計算行和列
rows,cols = len(matrix),len(matrix[0])
# nums是前綴和矩陣
nums = [[0 for _ in range(cols)] for _ in range(rows)]
for i in range(rows):
nums[i][0] = matrix[i][0]
for j in range(1,cols):
nums[i][j] = nums[i][j-1] + matrix[i][j]
# ans是保存符合要求的子矩陣的數量
ans = 0
# sum用於保存將多列前綴和累計爲單列前綴和的矩陣
sums = [0 for _ in range(rows)]
# 計算不同列之間組成的前綴和組合
for i in range(cols):
for j in range(i,cols):
if i == 0:
for k in range(rows):
sums[k] = nums[k][j]
else:
for k in range(rows):
sums[k] = nums[k][j] - nums[k][i-1]
# 將多列前綴和變爲單列前綴和之後執行下面操作
dicts = dict()
# dicts[0] = 1很重要
dicts[0] = 1
num = 0 # 用於保存前n個值之和
for n in sums:
num += n
if num-target in dicts.keys():
ans += dicts[num-target]
dicts.setdefault(num,0)
dicts[num] += 1
return ans