题目560:和为k的子数组
给定一个整数数组和一个整数 k,你需要找到该数组中和为 k 的连续的子数组的个数。
解答:
class Solution:
def subarraySum(self, nums: List[int], k: int) -> int:
nums_dict = {}
nums_sum = count = 0
for num in nums:
nums_sum += num
if nums_sum == k:
count += 1
if nums_sum - k in nums_dict:
count += nums_dict[nums_sum-k]
if nums_sum in nums_dict:
nums_dict[nums_sum] += 1
else:
nums_dict[nums_sum] = 1
return count
题目1074:元素和为目标值的子矩阵数量
给出矩阵 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’),那么这两个子矩阵也不同。
思路:
up和down 分别记录子矩阵的上边界和下边界。
dic记录:以当前up和down 为上下边界,以第0列为左边界,以第 j 列为右边界的子矩阵的前缀和出现的次数。
解答:
class Solution:
def numSubmatrixSumTarget(self, matrix: List[List[int]], target: int) -> int:
if target>10**7 or target<-10**7:
return 0
m=len(matrix)
n=len(matrix[0])
sum=[0]*n
res=0
for up in range(m):
for down in range(up,m):
#dic中key为前缀和,value为当前前缀和出现的次数
dic={}
tmp,count=0,0
for j in range(n):
if down==up:
sum[j]=matrix[down][j]
else:
sum[j]+=matrix[down][j]
tmp+=sum[j]
if tmp==target:
res+=1
if tmp-target in dic:
res+=dic[tmp-target]
if tmp in dic:
dic[tmp]+=1
else:
dic[tmp]=1
return res