码迷,mamicode.com
首页 > 其他好文 > 详细

LeetCode(24)元素和为目标值的子矩阵数量(困难)

时间:2021-06-03 17:42:38      阅读:0      评论:0      收藏:0      [点我收藏+]

标签:子矩阵   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 中。

 

LeetCode(24)元素和为目标值的子矩阵数量(困难)

标签:子矩阵   tar   tor   subarray   number   问题   计算   contains   int   

原文地址:https://www.cnblogs.com/ash98/p/14826904.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!