题目描述
给你一个 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]]
原题连接
链接:https://leetcode-cn.com/problems/matrix-block-sum/
一、基础框架
public int[][] matrixBlockSum(int[][] mat, int k) {
}
二、解题报告
1.思路分析
1、二维数组
2、动态规划
3、数组和相加 并减去重复的值
2.时间复杂度
时间复杂度 O ( m*n )
3.代码示例
tips:
public int[][] matrixBlockSum(int[][] mat, int k) {
int row = mat.length,col = mat[0].length;
int [][] ans = new int[row ][col];
//为了保证处于边界的前缀和计算方式一致,初始化为 row + 1 & col + 1;然后从下标1 开始计算
int [][] sum = new int[row + 1][col + 1];
for(int i = 1; i <= row; i ++){
for(int j = 1;j <= col;j++){
sum[i][j] = sum[i - 1][j] + sum[i][j - 1] - sum[i - 1][j - 1] + mat[i - 1][j - 1];
}
}
for(int i = 0; i < row;i++){
for(int j = 0;j < col;j++){
//处理新坐标 防止越界
int l1 = i -k <= 0 ? 1 : i -k +1;//mat i的最小值
int r1 = i + k >= row - 1 ? row : i + k + 1;//mat i的最大值
int l2 = j - k <= 0 ? 1 :j - k +1;//mat j的最小值
int r2 = j + k >= col - 1 ? col :j + k + 1; //mat中的j的最大值
ans[i][j] = sum[r1][r2] - sum[l1 -1][r2] - sum[r1][l2 - 1] + sum[l1 - 1][l2 - 1];
}
}
return ans;
}
2.知识点
1、很经典的动态规划题
2、注意问题的分解和转换
总结
动态规划有从顶向下 & 从下向上 注意学习