Leetcode: 1074. Number of Submatrices That Sum to Target

Problem Statement

from typing import List
from collections import defaultdict


class Solution:
    def numSubmatrixSumTarget(self, m: List[List[int]], target: int) -> int:
        N = len(m)
        M = len(m[0])

        csum = [[0] * M for _ in range(N)]
        for i in range(N):
            for j in range(M):
                csum[i][j] = m[i][j]
                if i > 0:
                    csum[i][j] += csum[i - 1][j]
        ans = 0
        for i0 in range(N):
            for i1 in range(i0, N):
                freq = defaultdict(int)
                cur = 0
                for j in range(M):
                    cur += csum[i1][j]
                    if i0 > 0:
                        cur -= csum[i0 - 1][j]
                    ans += freq[cur - target]
                    if cur == target:
                        ans += 1
                    freq[cur] += 1
        return ans


assert Solution().numSubmatrixSumTarget([[0, 1, 0], [1, 1, 1], [0, 1, 0]], 0) == 4
assert Solution().numSubmatrixSumTarget([[1, -1], [-1, 1]], 0) == 5
assert Solution().numSubmatrixSumTarget([[904]], 0) == 0