class Solution {
public:
vector<vector<int>> s;
vector<vector<int>> matrixBlockSum(vector<vector<int>>& a, int k) {
int m = a.size(), n = a[0].size();
//建立二维数组的前缀和、容斥原理
s.resize(m+1,vector<int>(n+1,0));
for(int i=1;i<=m;i++){
for(int j=1;j<=n;j++){
s[i][j] = s[i-1][j]+s[i][j-1]-s[i-1][j-1]+a[i-1][j-1];
}
}
vector<vector<int>> ans(m,vector<int>(n));
for(int i=0;i<m;i++){
for(int j=0;j<n;j++){
int x1 = max(1,i-k+1);
int y1 = max(1,j-k+1);
int x2 = min(m,i+k+1);
int y2 = min(n,j+k+1);
ans[i][j] = getSum(x1,y1,x2,y2);
}
}
return ans;
}
//查询
int getSum(int x1,int y1,int x2,int y2){
return s[x2][y2]-s[x1-1][y2]-s[x2][y1-1]+s[x1-1][y1-1];
}
};
LeetCode 1314. 矩阵区域和 (二维前缀和模板题)
猜你喜欢
转载自blog.csdn.net/qq_44846324/article/details/107503275
今日推荐
周排行