Leetcode每日一题】 二维前缀和 - 矩阵区域和(难度⭐⭐)(31)

1. 题目解析

题目链接:1314. 矩阵区域和

题目乍一看很晦涩难懂,又是大于等于又是k的

仔细分析,题目所说的意思就是以[i,j]为中心,求上下左右向外拓展k个单位的矩阵和,放在名为answer的矩阵中,最后返回answer矩阵即可

2.算法原理

在填写结果矩阵的过程中,一个核心步骤是确定原矩阵中对应区域的“左上角”和“右下角”的坐标。为了更好地理解,建议大家通过画图来辅助。

  • 首先,我们考虑左上角的坐标。理论上,它的x坐标是i减去k,y坐标是j减去k。但是,由于坐标可能超出原矩阵的范围,我们必须确保坐标不会小于0。因此,我们需要对0取最大值。经过修正,左上角的坐标为:x1 = max(0, i - k),y1 = max(0, j - k)。
  • 接下来,我们确定右下角的坐标。理论上,它的x坐标是i加上k,y坐标是j加上k。但同样地,我们也要考虑坐标不能超出原矩阵的边界,即不能大于m-1和n-1。因此,我们需要对m-1和n-1取最小值。修正后的右下角坐标为:x2 = min(m - 1, i + k),y2 = min(n - 1, j + k)。
  • 一旦我们得到了这两个关键坐标,就可以将它们代入到二维前缀和矩阵的计算公式中。不过,需要注意的是,在代入坐标时,我们可能需要考虑到下标的映射关系,确保计算的准确性。

通过这样的步骤,我们可以有效地确定原矩阵中对应区域的边界,进而进行后续的计算和填写结果矩阵的操作。

3.代码编写

class Solution 
{
public:
    vector<vector<int>> matrixBlockSum(vector<vector<int>>& mat, int k) 
    {
        int m = mat.size(), n = mat[0].size();
        vector<vector<int>> dp(m + 1, vector<int>(n + 1));
        for(int i = 1; i <= m; i++)
            for(int j =1; j <= n; j++)
                dp[i][j] = dp[i - 1][j] + dp[i][j - 1] - dp[i - 1][j - 1] + mat[i - 1][j - 1];//减一为了匹配原来的mat
        vector<vector<int>> ret(m, vector<int>(n));
        for(int i = 0; i < m; i++)
            for(int j = 0; j < n; j++)
            {
                int x1 = max(0, i - k) + 1, y1 = max(0, j - k) + 1;
                int x2 = min(m - 1, i + k) + 1, y2 = min(n - 1, j + k) + 1;//加一为了匹配dp表
                ret[i][j] = dp[x2][y2] - dp[x1 - 1][y2] - dp[x2][y1 - 1] + dp[x1 - 1][y1 - 1];
            }
        return ret;
    }
};

写在最后

嗯,就是这样啦,文章到这里就结束啦,真心感谢你花时间来读。

觉得有点收获的话,不妨给我点个吧!

如果发现文章有啥漏洞或错误的地方,欢迎私信我或者在评论里提醒一声~ 

最近更新

  1. TCP协议是安全的吗?

    2024-03-10 07:52:09       19 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-03-10 07:52:09       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-03-10 07:52:09       20 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-03-10 07:52:09       20 阅读

热门阅读

  1. BJFU|计算机网络缩写对照表

    2024-03-10 07:52:09       20 阅读
  2. 利用GPT开发应用005:Codex、Turbo、ChatGPT、GPT-4

    2024-03-10 07:52:09       25 阅读
  3. Python与HTTP服务交互

    2024-03-10 07:52:09       23 阅读
  4. ConcurrentHashMap 底层原理和JDK版本对比

    2024-03-10 07:52:09       19 阅读
  5. [axios]使用指南

    2024-03-10 07:52:09       20 阅读
  6. 【Vue3 组合式 API: reactive 和 ref 函数】

    2024-03-10 07:52:09       21 阅读
  7. 【conda】conda卸载并重新安装指定版本软件package

    2024-03-10 07:52:09       24 阅读
  8. 用C语言easyx 做一个《正弦彩环》

    2024-03-10 07:52:09       21 阅读
  9. python知网爬虫论文pdf下载+立即可用(动态爬虫)

    2024-03-10 07:52:09       21 阅读