码迷,mamicode.com
首页 > 编程语言 > 详细

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

时间:2017-09-23 12:29:29      阅读:210      评论:0      收藏:0      [点我收藏+]

标签:import   col   util   ide   pac   icp   package   ++   data   

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;
        }
    }


}

 

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

标签:import   col   util   ide   pac   icp   package   ++   data   

原文地址:http://www.cnblogs.com/stAr-1/p/7580614.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!