Number of Submatrices That Sum to Target

HardArrayHash TableMatrixPrefix Sum

Solution

export function numSubmatrixSumTarget(matrix: number[][], target: number): number {
  const [m, n] = [matrix.length, matrix[0].length];
  for (let row = 0; row < m; row++) {
    for (let col = 1; col < n; col++) {
      matrix[row][col] += matrix[row][col - 1];
    }
  }
 
  let answer = 0;
  for (let colStart = 0; colStart < n; colStart++) {
    for (let colEnd = colStart; colEnd < n; colEnd++) {
      const counter = new Map<number, number>([[0, 1]]);
      let sum = 0;
      for (let row = 0; row < m; row++) {
        sum += matrix[row][colEnd] - (0 < colStart ? matrix[row][colStart - 1] : 0);
        answer += counter.get(sum - target) ?? 0;
        counter.set(sum, (counter.get(sum) ?? 0) + 1);
      }
    }
  }
  return answer;
}