元素和为目标值的子矩阵数量

元素和为目标值的子矩阵数量

给出矩阵 matrix 和目标值 target,返回元素总和等于目标值的非空子矩阵的数量。

子矩阵 x1, y1, x2, y2 是满足 x1 <= x <= x2 且 y1 <= y <= y2 的所有单元 matrix[x][y] 的集合。

如果 (x1, y1, x2, y2) 和 (x1’, y1’, x2’, y2’) 两个子矩阵中部分坐标不同(如:x1 != x1’),那么这两个子矩阵也不同。

class Solution {
     
    public int numSubmatrixSumTarget(int[][] matrix, int target) {
     
        if(matrix.length == 0) {
     
            return 0;
        }
        
        int m = matrix.length, n = matrix[0].length;
        int count = 0;
        int i, j, k;
        
        for(i = 0; i < m; i++) {
     
            int[] sum = new int[n];
            for(j = i; j < m; j++) {
     
                Map<Integer, Integer> map = new HashMap<>();
                map.put(0, 1);
                int s = 0;
                for(k = 0; k < n; k++) {
     
                    sum[k] += matrix[j][k];
                    s += sum[k];
                    count += map.getOrDefault(s - target, 0);
                    map.put(s, map.getOrDefault(s, 0) + 1);
                }
            }
        }
        
        return count;
    }
}

本题思路:

3个for循环:

最外层for循环图例:

元素和为目标值的子矩阵数量_第1张图片

中间层for循环:

元素和为目标值的子矩阵数量_第2张图片

最里层for循环:

元素和为目标值的子矩阵数量_第3张图片

本题的精妙之处在于

map.put(s, map.getOrDefault(s, 0) + 1);这行代码,这行代码可以保证当两个子矩阵和为0时,加起来也为0,sum会+1。

count += map.getOrDefault(s - target, 0);这行代码可以保证。当矩阵中有一个值为0时,尽管前面的和不为0,也会保证同行有0时,sum会+1。

你可能感兴趣的:(每日算法,算法,leetcode,动态规划,java,数据结构)