二维数组子区域和的多次查询

题目描述

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  */

 

posted @ 2021-03-02 19:17  HickeyZhang  阅读(166)  评论(0)    收藏  举报