标签:子矩阵 tar tor subarray number 问题 计算 contains int
问题描述:
给出矩阵 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‘),那么这两个子矩阵也不同。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/number-of-submatrices-that-sum-to-target
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
代码:
class Solution {
public int numSubmatrixSumTarget(int[][] matrix, int target) {
int ans = 0;
int m = matrix.length, n = matrix[0].length;
for (int i = 0; i < m; ++i) { // 枚举上边界
int[] sum = new int[n];
for (int j = i; j < m; ++j) { // 枚举下边界
for (int c = 0; c < n; ++c) {
sum[c] += matrix[j][c]; // 更新每列的元素和
}
ans += subarraySum(sum, target);
}
}
return ans;
}
public int subarraySum(int[] nums, int k) {
Map<Integer, Integer> map = new HashMap<Integer, Integer>();
map.put(0, 1);
int count = 0, pre = 0;
for (int x : nums) {
pre += x;
if (map.containsKey(pre - k)) {
count += map.get(pre - k);
}
map.put(pre, map.getOrDefault(pre, 0) + 1);
}
return count;
}
}
值得注意的:
我们枚举子矩阵的上下边界,并计算出该边界内每列的元素和,则原问题转换成了如下一维问题:
给定一个整数数组和一个整数 target,计算该数组中子数组和等于target 的子数组个数。
对于每列的元素和 sum 的计算,我们在枚举子矩阵上边界 i时,初始下边界 j为 i,此时 sum 就是矩阵第 i行的元素。每次向下延长下边界 j 时,我们可以将矩阵第 j 行的元素累加到sum 中。
标签:子矩阵 tar tor subarray number 问题 计算 contains int
原文地址:https://www.cnblogs.com/ash98/p/14826904.html