304. 二维区域和检索 - 矩阵不可变

 1 class NumMatrix 
 2 {
 3     vector<vector<int>> s;
 4 public:
 5     NumMatrix(vector<vector<int>>& matrix) 
 6     {
 7         if(matrix.empty() || matrix[0].empty()) return;
 8         int m = matrix.size();
 9         int n = matrix[0].size();
10         s = vector<vector<int>>(m + 1,vector<int>(n + 1,0));
11         for(int i = 1;i <= m;i ++)
12         {
13             for(int j = 1;j <= n;j ++)
14             {
15                 //根据表格分析可得
16                 //s[2,2] = s[1,2] + s[2,1] - s[1,1] + matrix[1,1];
17                 s[i][j] = s[i - 1][j] + s[i][j - 1] - s[i - 1][j - 1] + matrix[i - 1][j - 1];
18             }
19         }
20     }
21     
22     //(x1,y1),(x2,y2)这一子矩阵中所有数的和:s[x2,y2] - s[x1 - 1,y2] - s[x2,y1 - 1] + s[x1 - 1,y1 - 1]
23     //由于下标从1开始,所以横纵坐标都加上1
24     int sumRegion(int row1, int col1, int row2, int col2) 
25     {
26         return s[row2 + 1][col2 + 1] - s[row2 + 1][col1] - s[row1][col2 + 1] + s[row1][col1];
27     }
28 };
29 
30 /**
31  * Your NumMatrix object will be instantiated and called as such:
32  * NumMatrix* obj = new NumMatrix(matrix);
33  * int param_1 = obj->sumRegion(row1,col1,row2,col2);
34  */

 

posted @ 2020-04-16 17:27  Jinxiaobo0509  阅读(144)  评论(0)    收藏  举报