原题链接:Leetcode 1074. 元素和为目标值的子矩阵数量
暴力:
class Solution {
public:
int numSubmatrixSumTarget(vector<vector<int>>& matrix, int target) {
int n=matrix.size(),m=matrix[0].size();
int res=0;
for(int top=0;top<n;top++)
{
vector<int> v(m,0);
vector<int> sum(m+1,0);
for(int low=top;low<n;low++)
{
for(int r=0;r<m;r++)
{
v[r]+=matrix[low][r];
sum[r+1]=sum[r]+v[r];
}
for(int l=1;l<=m;l++)
{
for(int r=l;r<=m;r++)
{
if(sum[r]-sum[l-1]==target) res++;
}
}
}
}
return res;
}
};
优化:参考Leetcode 560. 和为 K 的子数组 前缀和
class Solution {
public:
int subarraySum(vector<int> nums,int k)
{
int res=0,sum=0;
unordered_map<int,int> mp;
mp[0]=1;
for(int i=0;i<nums.size();i++)
{
sum+=nums[i];
if(mp.count(sum-k)) res+=mp[sum-k];
mp[sum]++;
}
return res;
}
int numSubmatrixSumTarget(vector<vector<int>>& matrix, int target) {
int n=matrix.size(),m=matrix[0].size();
int res=0;
for(int top=0;top<n;top++)
{
vector<int> v(m,0);
vector<int> sum(m+1,0);
for(int low=top;low<n;low++)
{
for(int r=0;r<m;r++)
{
v[r]+=matrix[low][r];
}
res+=subarraySum(v,target);
}
}
return res;
}
};