大家好,我是晴天学长,今天的算法题思想用到了二维数组的前缀和,是考试中非常重要的考点,其思维的拓展我感觉是非常重要的,所以我就记录了下来,题目不难,但是知识的思路的运用还是值得学习的,需要的小伙伴请自取哦!
(1)注意要从1开始,防止越界
(2)
我们从这几个图来分析,红色是我们的目标求和矩阵,我们并无法直接通过二维数组求出来,我们设红色矩阵左上角的坐标为x1,y1以及右下角坐标为x2,y2。 我们可以先通过颜色标记大矩阵然后减去两个绿色的矩阵(包括青色),其中青色矩阵被减去了两次,所以我们还需要再加回来一次。
所以已知两点坐标求该矩阵和的公式为:
s[x2][y2]-s[x1-1][y2]-s[x2][y1-1]+s[x1-1][y1-1]
class NumMatrix {
int[][] arr;
public NumMatrix(int[][] matrix) {
int n=matrix.length;
if(n>0){
int m=matrix[0].length;
arr=new int[n+1][m+1];
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
//因为它是从0开始的,所以下标都要+1,从1开始的定理不变。
arr[i+1][j+1]=arr[i][j+1]+arr[i+1][j]-arr[i][j]+matrix[i][j];
}
}
}
}
public int sumRegion(int row1, int col1, int row2, int col2) {
return arr[row2+1][col2+1]-arr[row1][col2+1]-arr[row2+1][col1]+arr[row1][col1];
}
}
/**
* Your NumMatrix object will be instantiated and called as such:
* NumMatrix obj = new NumMatrix(matrix);
* int param_1 = obj.sumRegion(row1,col1,row2,col2);
*/