Leetcode•Oct 02, 2026

Count Submatrices With All Ones

Hazrat Ali

Leetcode

Given an m x n binary matrix mat, return the number of submatrices that have all ones.

 

Example 1:

Input: mat = [[1,0,1],[1,1,0],[1,1,0]]
Output: 13
Explanation: 
There are 6 rectangles of side 1x1.
There are 2 rectangles of side 1x2.
There are 3 rectangles of side 2x1.
There is 1 rectangle of side 2x2. 
There is 1 rectangle of side 3x1.
Total number of rectangles = 6 + 2 + 3 + 1 + 1 = 13.

Example 2:

Input: mat = [[0,1,1,0],[0,1,1,1],[1,1,1,0]]
Output: 24
Explanation: 
There are 8 rectangles of side 1x1.
There are 5 rectangles of side 1x2.
There are 2 rectangles of side 1x3. 
There are 4 rectangles of side 2x1.
There are 2 rectangles of side 2x2. 
There are 2 rectangles of side 3x1. 
There is 1 rectangle of side 3x2. 
Total number of rectangles = 8 + 5 + 2 + 4 + 2 + 2 + 1 = 24.

Solution

var numSubmat = function(mat) {
    const m = mat.length;
    const n = mat[0].length;

    const heights = new Array(n).fill(0);
    let answer = 0;

    for (let i = 0; i < m; i++) {

        for (let j = 0; j < n; j++) {
            if (mat[i][j] === 1) {
                heights[j]++;
            } else {
                heights[j] = 0;
            }
        }

        const stack = [];
        const dp = new Array(n).fill(0);

        for (let j = 0; j < n; j++) {
            while (
                stack.length > 0 &&
                heights[stack[stack.length - 1]] >= heights[j]
            ) {
                stack.pop();
            }

            if (stack.length === 0) {
                dp[j] = heights[j] * (j + 1);
            } else {
                const prev = stack[stack.length - 1];
                dp[j] = dp[prev] + heights[j] * (j - prev);
            }

            stack.push(j);
            answer += dp[j];
        }
    }

    return answer;
};

 

Comments