这道题,我一开始的思路就是老老实实自己再写一个函数挨个挨个遍历把和求出来,但无奈竟然不会写初始化那部分的代码,我惊呆了!
于是老实巴交地跑去看题解,然后,然后。。。震惊了我的世界观!
我敲,竟然还可以用前缀和!?太离谱。。。哦不,太神奇了吧!
所以嘞,且听我分析分析:这题反正不就是求某一个给定区域的和嘛,你想啊,对于某一行而言,如果任何一个位置i,如果此位置表示从第1个位置一直到该位置所有数的和,那么最终,我在求和的时候,就只需要拿末位置减去初位置就可以了。神奇!
然后就很简单了!
1 private int[][] sum; 2 public NumMatrix(int[][] matrix) { 3 if (matrix != null) { 4 int n = matrix.length; 5 int m = matrix[0].length; 6 sum = new int[n][m+1]; 7 for (int i = 0; i < n; ++i) { 8 for (int j = 0; j < m; ++j) { 9 sum[i][j+1] = sum[i][j] + matrix[i][j]; 10 } 11 } 12 } 13 } 14 15 public int sumRegion(int row1, int col1, int row2, int col2) { 16 int total = 0; 17 for (int i = row1; i <= row2; ++i) { 18 total += (sum[i][col2+1] - sum[i][col1]); 19 } 20 return total; 21 }
这样就行了。