LeetCode算法心得——二维区域和检索 - 矩阵不可变(二维前缀和)

大家好,我是晴天学长,今天的算法题思想用到了二维数组的前缀和,是考试中非常重要的考点,其思维的拓展我感觉是非常重要的,所以我就记录了下来,题目不难,但是知识的思路的运用还是值得学习的,需要的小伙伴请自取哦!


1 )二维区域和检索 - 矩阵不可变


2) .算法思路

  • (1)注意要从1开始,防止越界

  • (2)
    我们从这几个图来分析,红色是我们的目标求和矩阵,我们并无法直接通过二维数组求出来,我们设红色矩阵左上角的坐标为x1,y1以及右下角坐标为x2,y2。 我们可以先通过颜色标记大矩阵然后减去两个绿色的矩阵(包括青色),其中青色矩阵被减去了两次,所以我们还需要再加回来一次。

    所以已知两点坐标求该矩阵和的公式为:

     s[x2][y2]-s[x1-1][y2]-s[x2][y1-1]+s[x1-1][y1-1]
    

    这个公式再次体现了为什么下标都要从1开始的好处,防止越界问题。LeetCode算法心得——二维区域和检索 - 矩阵不可变(二维前缀和)_第1张图片


3).代码示例

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);
 */

4).总结

  • 二维数组的前缀和的过程要理解。
  • 二维数组的矩阵求和怎么来的要理解。

你可能感兴趣的:(算法,算法,leetcode,矩阵,java)