[leetcode]304Range Sum Query 2D - Immutable动态规划计算二维数组中子数组的sum

303一维数组的升级版,方法就是用二维数组res存下从(0,0)到当前位置的sum,存的方法是动态规划,看着二维数组画圈比较好搞清楚其中的加减法

算子数组的sum的时候也是和存差不多的逻辑,就是某一部分加上另一部分,然后减去某一部分,逻辑画画圈就能看出来

比价重要的是动态规划存数的过程,以后二维数组问题应该会经常用

package com.DynamicProgramming;

import java.util.HashMap;
import java.util.Map;

/**
 * Given a 2D matrix matrix,
 * find the sum of the elements inside the rectangle defined by its upper left corner (row1, col1) and lower right corner (row2, col2).
 * Example:
 Given matrix = [
 [3, 0, 1, 4, 2],
 [5, 6, 3, 2, 1],
 [1, 2, 0, 1, 5],
 [4, 1, 0, 1, 7],
 [1, 0, 3, 0, 5]
 ]

 sumRegion(2, 1, 4, 3) -> 8
 sumRegion(1, 1, 2, 2) -> 11
 sumRegion(1, 2, 2, 4) -> 12
 Note:
 You may assume that the matrix does not change.
 There are many calls to sumRegion function.
 You may assume that row1 ≤ row2 and col1 ≤ col2.
 */
public class Q304RangeSumQuery2D_Immutable {
    /**
     * Your NumMatrix object will be instantiated and called as such:
     * NumMatrix obj = new NumMatrix(matrix);
     * int param_1 = obj.sumRegion(row1,col1,row2,col2);
     */
    class NumMatrix {
        int[][] data;
        public NumMatrix(int[][] matrix) {
            if (matrix.length == 0)
                return;
            int m = matrix.length;
            int n = matrix[0].length;
             data = new int[m][n];
            //初始条件1
            data[0][0] = matrix[0][0];
            //初始条件2,同时也是动态规划1
            for (int i = 1; i < m; i++) {
                data[i][0] = data[i-1][0] + matrix[i][0];
            }
            for (int i = 1; i < n; i++) {
                data[0][i] = data[0][i-1] + matrix[0][i];
            }
            //记录从当前位置到(0,0)点的sum,动态规划2
            for (int i = 1; i < m; i++) {
                for (int j = 1; j < n; j++) {
                    data[i][j] = data[i-1][j] + data[i][j-1] - data[i-1][j-1] + matrix[i][j];
                }
            }
        }

        public int sumRegion(int row1, int col1, int row2, int col2) {
            int res = data[row2][col2];
            if (col1 >= 1 && row1 >= 1)
            {
                res  = res - data[row2][col1-1] - data[row1-1][col2] + data[row1-1][col1-1];
            }
            else if (col1 >= 1)
                res -= data[row2][col1-1];
            else if (row1 >= 1)
                res -= data[row1-1][col2];
            return res;
        }
    }


}

 

posted @ 2017-09-23 11:04  stAr_1  阅读(477)  评论(0编辑  收藏  举报