题目链接:https://leetcode-cn.com/problems/range-sum-query-2d-immutable/submissions/
方法1:动态规划
取数组m[][],其中m[i][j]意为从matrix[0][0]到matrix[i][j]这个区域的和.
public class NumMatrix2 {
int[][] m;
public NumMatrix2(int[][] matrix) {
int rowsize = matrix.length;
if (rowsize != 0) {
int colsize = matrix[0].length;
m = new int[rowsize][colsize];
m[0][0] = matrix[0][0];
for (int i = 1; i < rowsize; i++) {
m[i][0] = m[i - 1][0] + matrix[i][0];
}
for (int j = 1; j < colsize; j++) {
m[0][j] = m[0][j - 1] + matrix[0][j];
}
for (int i = 1; i < rowsize; i++) {
for (int j = 1; j < colsize; j++) {
m[i][j] = m[i - 1][j] + m[i][j - 1] - m[i - 1][j - 1] + matrix[i][j];
}
}
}
}
public int sumRegion(int row1, int col1, int row2, int col2) {
if (row1 == 0 && col1 == 0) {
return m[row2][col2];
} else if (row1 == 0) {
return m[row2][col2] - m[row2][col1 - 1];
} else if (col1 == 0) {
return m[row2][col2] - m[row1 - 1][col2];
} else {
return m[row2][col2] - m[row1 - 1][col2] - m[row2][col1-1] + m[row1 - 1][col1 - 1];
}
}
}
方法2:基于一维数组快速求和,改编
int[][] m;
public NumMatrix(int[][] matrix) {
int rowsize = matrix.length;
int colsize = matrix[0].length;
if (rowsize != 0 && colsize != 0) {
m = new int[rowsize][colsize];
for (int i = 0; i < matrix.length; i++) {
for (int j = 0; j < matrix[0].length; j++) {
if (j == 0) {
m[i][j] = matrix[i][j];
} else {
m[i][j] = m[i][j - 1] + matrix[i][j];
}
}
}
}
}
public int sumRegion(int row1, int col1, int row2, int col2) {
int sum = 0;
for (int i = row1; i <= row2; i++) {
if (col1 > 0) {
sum += (m[i][col2] - m[i][col1 - 1]);
} else if (col1 == 0) {
sum += m[i][col2];
}
}
return sum;
}