前缀和-1314.矩阵区域和-力扣(LeetCode)
一、题目解析
1、返回的answer矩阵和mat矩阵大小一致
2、answer[i][j]的值为以(i,j)位置向外扩展k位置的矩形位置所有元素的和
二、算法原理
解法:二维前缀和
dp表计算公式
应用公式
下标映射关系
所需的x1、y1、x2和y2的计算
细节问题:
1、dp表和mat的下标映射关系
2、answer表和dp表的下标映射关系
三、代码示例
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,0)),ret(m,vector<int>(n));for(int i = 1;i<m+1;i++){for(int j = 1;j<n+1;j++)dp[i][j] = dp[i-1][j]+dp[i][j-1]-dp[i-1][j-1]+mat[i-1][j-1];}int x1,x2,y1,y2;for(int i = 0;i<m;i++){for(int j = 0;j<n;j++){x1 = max(0,i-k),y1 = max(0,j-k);x2 = min(m-1,i+k),y2 = min(n-1,j+k);ret[i][j] = dp[x2+1][y2+1]-dp[x1][y2+1]-dp[x2+1][y1]+dp[x1][y1];}}return ret;}
};