欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 文旅 > 游戏 > 1314. 矩阵区域和

1314. 矩阵区域和

2024/10/24 1:57:24 来源:https://blog.csdn.net/YQ20210216/article/details/142909398  浏览:    关键词:1314. 矩阵区域和

文章目录

  • 1.题目
  • 2.思路
  • 3.代码


1.题目

1314. 矩阵区域和

给你一个 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]]

2.思路

每个元素表示从矩阵左上角 (0, 0) 到当前位置的矩形区域的所有元素的和。然后,对于每个元素 (i, j),根据前缀和矩阵快速计算以 (i, j) 为中心、半径为 k 的矩形区域的和,其中利用四个前缀和值来快速计算任意矩形的和

3.代码

class Solution {
public:vector<vector<int>> matrixBlockSum(vector<vector<int>>& mat, int k) {int m = mat.size();int n = mat[0].size();// 创建前缀和矩阵,大小为 (m+1)x(n+1) 方便处理边界vector<vector<int>> dp(m + 1, vector<int>(n + 1, 0));// 计算前缀和矩阵for (int i = 1; i <= m; ++i) {for (int j = 1; j <= n; ++j) {dp[i][j] = mat[i - 1][j - 1] + dp[i - 1][j] +dp[i][j - 1] - dp[i - 1][j - 1];}}// 创建结果矩阵vector<vector<int>> answer(m, vector<int>(n, 0));// 计算每个位置的块和for (int i = 0; i < m; ++i) {for (int j = 0; j < n; ++j) {// 确定块的边界int x1 = max(0, i - k);int y1 = max(0, j - k);int x2 = min(m - 1, i + k);int y2 = min(n - 1, j + k);// 利用前缀和计算块和answer[i][j] = dp[x2 + 1][y2 + 1] -dp[x1][y2 + 1] - dp[x2 + 1][y1] +dp[x1][y1];}}return answer;}
};

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com