303. 区域和检索 - 数组不可变 304. 二维区域和检索 - 矩阵不可变

题解

两道题都属于入门的dp题 但是304难度高一些 主要在于如何推导保存处理值


class NumArray {
    int[] dps;
    public NumArray(int[] nums) {
        dps = new int[nums.length];
        if (nums.length == 0) return;
        dps[0] = nums[0];
        for (int i = 1; i < nums.length;i++){
            dps[i] = dps[i - 1] + nums[i];
        }
    }

    public int sumRange(int i, int j) {
        if (i == 0) return dps[j];
        return dps[j] - dps[i - 1];
    }
}

/**
 * Your NumArray object will be instantiated and called as such:
 * NumArray obj = new NumArray(nums);
 * int param_1 = obj.sumRange(i,j);
 */


    class NumMatrix {
        int [][] dps;
        public NumMatrix(int[][] matrix) {
            int m = matrix.length;
            if (m == 0) return;
            int n = matrix[0].length;
            dps = new int[m][n];
            for (int i = 0 ; i < m;i++){
                for (int j = 0; j < n;j++){
                    int value = matrix[i][j];
                    if (i - 1 >=0 && j -1 >=0){
                        value -= dps[i - 1][j - 1];
                    }
                     if (i - 1 >=0){
                        value += dps[i -1][j];
                    }
                     if (j - 1 >= 0){
                        value += dps[i][j - 1];
                    }
                    dps[i][j] = value;
                }
            }
        }

        public int sumRegion(int row1, int col1, int row2, int col2) {
             return (col1 - 1>= 0 ?-dps[row2][col1 - 1] : 0) 
              + (row1 - 1>= 0 ?- dps[row1 - 1][col2] : 0) 
              + dps[row2][col2]
              + (row1 - 1>= 0 && col1 - 1>= 0  ? dps[row1 - 1][col1 - 1] :0);
        }
    }

/**
 * Your NumMatrix object will be instantiated and called as such:
 * NumMatrix obj = new NumMatrix(matrix);
 * int param_1 = obj.sumRegion(row1,col1,row2,col2);
 */

posted @ 2021-01-02 18:15  backTraced  阅读(41)  评论(0编辑  收藏  举报