[leetcode]304Range Sum Query 2D - Immutable动态规划计算二维数组中子数组的sum
Posted stAr_1
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[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; } } }
以上是关于[leetcode]304Range Sum Query 2D - Immutable动态规划计算二维数组中子数组的sum的主要内容,如果未能解决你的问题,请参考以下文章
[leetcode]304. Range Sum Query 2D - Immutable二维区间求和 - 不变
leetcode 304. Range Sum Query 2D
[leetcode]304Range Sum Query 2D - Immutable动态规划计算二维数组中子数组的sum
304. Range Sum Query 2D - Immutable