题目描述
解决方法
使用前缀和 + 哈希表的方式解决
对于这种复杂的问题,我们可以对问题进行分解,因为我们之前做过一道一位数组的题目
https://leetcode-cn.com/problems/subarray-sum-equals-k/
所以我们可以考虑能否将问题化归到我们已知的问题上。
对于二维矩阵的块的加和,我们可以将这个步骤分解为两个步骤,先对列进行加和,在对行进行加和。对于列的加和,我们在列上找两个端点 i 和 j ,使用O(n^2)的时间复杂度将所有端点的组合都列举加和一遍。这样我们就得到了一个有n列和的一维数组。对于这个数组,我们就利用之前的方法解答。
最终代码如下
class Solution {
public:
int numSubmatrixSumTarget(vector<vector<int>>& matrix, int target) {
int m = matrix.size();
int n = matrix[0].size();
int res = 0;
for(int i=0;i<m;i++){
vector<int> sum(n, 0);
for(int j=i;j<m;j++){
for(int k=0;k<n;k++){
sum[k]+=matrix[j][k];
}
res += numFromOne(sum, target);
}
}
return res;
}
int numFromOne(vector<int> &nums, int target){
unordered_map<int, int> mp;
int sum=0;
mp[sum]=1;
int res=0;
for(int i=0;i<nums.size();i++){
sum+=nums[i];
int temp = sum - target;
if(mp.find(temp) != mp.end()){
res += mp[temp];
}
mp[sum]+=1;
}
return res;
}
};