算法记录
LeetCode 题目:
给定一个二维矩阵 matrix,以下类型的多个请求:计算其子矩形范围内元素的总和,该子矩阵的左上角为 (row1, col1) ,右下角为 (row2, col2) 。
思路
说明
一、题目
实现 NumMatrix 类:
- NumMatrix(int[][] matrix) 给定整数矩阵 matrix 进行初始化
- int sumRegion(int row1, int col1, int row2, int col2) 返回左上角 (row1, col1) 、右下角 (row2, col2) 的子矩阵的元素总和。
二、分析
- 分析题目可得是一个一次存储多次计算读取的任务,那就需要构建一个可以快速返回计算结果的结构。
- 从概率论的二维分布引出,可以求取每一个二维点的前缀和,然后只需要减去两个边缘的前缀再添加上一个多减去的前缀即可。
- 难点就转换为构建二维矩阵的前缀和,前缀和用同样的思想来计算,加上点所代表的值即可。
class NumMatrix {
private int[][] sums;
public NumMatrix(int[][] matrix) {
sums = new int[matrix.length][matrix[0].length];
for(int i = 0; i < sums.length; i++) {
for(int j = 0; j < sums[0].length; j++) {
int sum = 0;
if((i - 1) >= 0) sum += sums[i - 1][j];
if((j - 1) >= 0) sum += sums[i][j - 1];
if(((j - 1) >= 0) && ((i - 1) >= 0)) sum -= sums[i - 1][j - 1];
sums[i][j] = sum + matrix[i][j];
}
}
}
public int sumRegion(int row1, int col1, int row2, int col2) {
int sum = sums[row2][col2];
if((col1 - 1) >= 0) sum -= sums[row2][col1 - 1];
if((row1 - 1) >= 0) sum -= sums[row1 - 1][col2];
if(((row1 - 1) >= 0) && ((col1 - 1) >= 0)) sum += sums[row1 - 1][col1 - 1];
return sum;
}
}
总结
熟悉前缀和的特性。