元素和为目标值的子矩阵数量
给出矩阵 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循环图例:
中间层for循环:
最里层for循环:
本题的精妙之处在于
map.put(s, map.getOrDefault(s, 0) + 1);
这行代码,这行代码可以保证当两个子矩阵和为0时,加起来也为0,sum会+1。
count += map.getOrDefault(s - target, 0);
这行代码可以保证。当矩阵中有一个值为0时,尽管前面的和不为0,也会保证同行有0时,sum会+1。