Skip to content

1074. Number of Submatrices That Sum to Target

Description

Given a matrix and a target, return the number of non-empty submatrices that sum to .

A submatrix x1, y1, x2, y2 is the set of all cells matrix[x][y] with x1 <= x <= x2 and y1 <= y <= y2.

Two submatrices (x1, y1, x2, y2) and (x1', y1', x2', y2') are different if they have some coordinate that is different: for example, if x1 != x1'.

 

Example 1:

Input: matrix = [[0,1,0],[1,1,1],[0,1,0]], target = 0
Output: 4
Explanation: The four 1x1 submatrices that only contain 0.

Example 2:

Input: matrix = [[1,-1],[-1,1]], target = 0
Output: 5
Explanation: The two 1x2 submatrices, plus the two 2x1 submatrices, plus the 2x2 submatrix.

Example 3:

Input: matrix = [[904]], target = 0
Output: 0

 

Constraints:

  • 1 <= matrix.length <= 100
  • 1 <= matrix[0].length <= 100
  • -1000 <= matrix[i][j] <= 1000
  • -10^8 <= target <= 10^8

 

Solutions

Solution: Prefix Sum

  • Time complexity: O(mn2)
  • Space complexity: O(m)

 

JavaScript

js
/**
 * @param {number[][]} matrix
 * @param {number} target
 * @return {number}
 */
const numSubmatrixSumTarget = function (matrix, target) {
  const m = matrix.length;
  const n = matrix[0].length;
  let result = 0;

  for (let row = 0; row < m; row++) {
    for (let col = 1; col < n; col++) {
      matrix[row][col] += matrix[row][col - 1];
    }
  }

  for (let left = 0; left < n; left++) {
    for (let right = left; right < n; right++) {
      const sumCountMap = new Map([[0, 1]]);
      let sum = 0;

      for (let row = 0; row < m; row++) {
        sum += matrix[row][right];

        if (left > 0) sum -= matrix[row][left - 1];

        result += sumCountMap.get(sum - target) ?? 0;
        sumCountMap.set(sum, (sumCountMap.get(sum) ?? 0) + 1);
      }
    }
  }
  return result;
};

Released under the MIT license