LeetCode 1314. 矩阵区域和 (二维前缀和模板题)

矩阵区域和

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];
    }    
};

猜你喜欢

转载自blog.csdn.net/qq_44846324/article/details/107503275