class Solution:
def numSubmatrixSumTarget(self, matrix: List[List[int]], target: int) -> int:
"""
tc O(R*C*C) sc O(R)
main idea: refer to 363. Max Sum of Rectangle No Larger Than K
"""
r,c = len(matrix), len(matrix[0])
res = 0
for col_left in range(c):
arr = [0] * r
for col_right in range(col_left,c):
for row in range(r):
arr[row] += matrix[row][col_right]
res += self.countSumK(arr, target)
return res
def countSumK(self, A, k):
psum = cnt = 0
d = {0:1}
# psumr - psumr == k => psumr - k == psum l
for a in A:
psum += a
if psum - k in d:
cnt += d[psum-k]
d[psum] = d.get(psum,0) +1
return cnt