矩阵求和


  1. 矩阵区域和
    给你一个 m x n 的矩阵 mat 和一个整数 k ,请你返回一个矩阵 answer ,其中每个 answer[i][j] 是所有满足下述条件的元素 mat[r][c] 的和:

i - k <= r <= i + k,
j - k <= c <= j + k 且
(r, c) 在矩阵内。

示例 1:

输入:mat = [[1,2,3],[4,5,6],[7,8,9]], k = 1
输出:[[12,21,16],[27,45,33],[24,39,28]]
示例 2:

输入:mat = [[1,2,3],[4,5,6],[7,8,9]], k = 2
输出:[[45,45,45],[45,45,45],[45,45,45]]

提示:

m == mat.length
n == mat[i].length
1 <= m, n, k <= 100
1 <= mat[i][j] <= 100
吐槽一句力扣传参数组从零开始坑死我了, 写了那么多ifelse😫

class Solution {
public:
    vector<vector<int>> matrixBlockSum(vector<vector<int>>& m, int k) {
        int n = m.size(), mm = m[0].size();
        vector<vector<int>> res(n, vector<int>(mm));
        vector<vector<int>> s(n, vector<int>(mm));
        for(int i = 0; i < n; i ++)
        {
            for(int j = 0; j < mm; j ++)
            {
                if(!i && !j)s[i][j] = m[i][j];
                else if(!i)s[i][j] = s[i][j - 1];
                else if(!j)s[i][j] = s[i - 1][j];
                else s[i][j] = s[i - 1][j] + s[i][j - 1] - s[i - 1][j - 1];
                if(i || j)s[i][j] += m[i][j];
            }
        }
        for(int i = 0; i < n; i ++)
        {
            for(int j = 0; j < mm; j ++)
            {
                int a = i + k, b = j + k;
                if(a > n - 1)a = n - 1;
                if(b > mm - 1)b = mm - 1;
                int x = i - k, y = j - k;
                if(x < 0)x = 0;
                if(y < 0)y = 0;
                if(!x && !y)res[i][j] = s[a][b];
                else if(!x)res[i][j] = s[a][b] - s[a][y - 1];
                else if(!y)res[i][j] = s[a][b] - s[x - 1][b];
                else res[i][j] = s[a][b] - s[x - 1][b] - s[a][y - 1] + s[x - 1][y - 1];
            }
        }
        return res;
    }
};


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM