二维数组子区域和的多次查询
题目描述
304. 二维区域和检索 - 矩阵不可变 难度:中等-简单
解法
解法一
利用03.01题的思路,在求区域和时,利用每行的部分和可以通过03.01的方法求出,再累加各行的和。
这样,每次查询的时间复杂度与查询的行数成正比。
代码:
1 class NumMatrix { 2 int[][] partSum; 3 public NumMatrix(int[][] matrix) { 4 if(matrix.length==0){ 5 return ; 6 } 7 partSum = new int[matrix.length][matrix[0].length+1]; 8 for(int i=0;i<matrix.length;i++){ 9 for(int j=0;j<matrix[0].length;j++){ 10 partSum[i][j+1] = partSum[i][j]+matrix[i][j]; 11 } 12 } 13 } 14 15 public int sumRegion(int row1, int col1, int row2, int col2) { 16 int Sum = 0; 17 for(int i = row1;i <= row2;i++){ 18 Sum += partSum[i][col2 + 1] - partSum[i][col1]; 19 } 20 return Sum; 21 } 22 } 23 24 /** 25 * Your NumMatrix object will be instantiated and called as such: 26 * NumMatrix obj = new NumMatrix(matrix); 27 * int param_1 = obj.sumRegion(row1,col1,row2,col2); 28 */
解法二
另一种思路借鉴概率论和数理统计中求联合概率分布的方法。先直接求出从二维数组左上角开始的全部子区域的和,查询时直接作差。
预处理和:
S(O,D)=S(O,B)+S(O,C)-S(O,A)+Matrix(D);

求部分和:
S(A,D)=S(O,E)+S(O,F)-S(O,G);

代码:
1 class NumMatrix { 2 int partSum[][]; 3 public NumMatrix(int[][] matrix) { 4 if(matrix.length == 0){ 5 return; 6 } 7 partSum = new int[matrix.length + 1][matrix[0].length+1]; 8 for(int i = 0;i<matrix.length;i++){ 9 for(int j = 0;j<matrix[0].length;j++){ 10 partSum[i+1][j+1] = partSum[i][j+1] + partSum[i+1][j] - partSum[i][j] + matrix[i][j]; 11 } 12 } 13 } 14 public int sumRegion(int row1, int col1, int row2, int col2) { 15 return partSum[row2+1][col2+1] - partSum[row2+1][col1] - partSum[row1][col2+1] + partSum[row1][col1]; 16 } 17 } 18 19 /** 20 * Your NumMatrix object will be instantiated and called as such: 21 * NumMatrix obj = new NumMatrix(matrix); 22 * int param_1 = obj.sumRegion(row1,col1,row2,col2); 23 */

浙公网安备 33010602011771号