@@ -57,7 +57,11 @@ numMatrix.sumRegion(1, 2, 2, 4); // return 12 (蓝色矩形框的元素总和)
57
57
58
58
<!-- 这里可写通用的实现逻辑 -->
59
59
60
- 动态规划-二维前缀和。
60
+ ** 方法一:二维前缀和**
61
+
62
+ 二维前缀和计算公式:` s[i + 1][j + 1] = s[i + 1][j] + s[i][j + 1] - s[i][j] + nums[i][j] ` 。
63
+
64
+ 子矩阵和计算公式:` ans = s[x2 + 1][y2 + 1] - s[x2 + 1][y1] - s[x1][y2 + 1] + s[x1][y1] ` 。
61
65
62
66
<!-- tabs:start -->
63
67
@@ -70,13 +74,14 @@ class NumMatrix:
70
74
71
75
def __init__ (self , matrix : List[List[int ]]):
72
76
m, n = len (matrix), len (matrix[0 ])
73
- self .pre = [[0 ] * (n + 1 ) for _ in range (m + 1 )]
74
- for i in range (1 , m + 1 ):
75
- for j in range (1 , n + 1 ):
76
- self .pre[i][j] = self .pre[i - 1 ][j] + self .pre[i][j - 1 ] - self .pre[i - 1 ][j - 1 ] + matrix[i - 1 ][j - 1 ]
77
+ self .s = [[0 ] * (n + 1 ) for _ in range (m + 1 )]
78
+ for i, row in enumerate (matrix):
79
+ for j, v in enumerate (row):
80
+ self .s[i + 1 ][j + 1 ] = self .s[i][j + 1 ] + self .s[i + 1 ][j] - self .s[i][j] + v
81
+
77
82
78
83
def sumRegion (self , row1 : int , col1 : int , row2 : int , col2 : int ) -> int :
79
- return self .pre [row2 + 1 ][col2 + 1 ] - self .pre [row2 + 1 ][col1] - self .pre [row1][col2 + 1 ] + self .pre [row1][col1]
84
+ return self .s [row2 + 1 ][col2 + 1 ] - self .s [row2 + 1 ][col1] - self .s [row1][col2 + 1 ] + self .s [row1][col1]
80
85
81
86
82
87
# Your NumMatrix object will be instantiated and called as such:
@@ -90,20 +95,20 @@ class NumMatrix:
90
95
91
96
``` java
92
97
class NumMatrix {
93
- private int [][] pre ;
98
+ private int [][] s ;
94
99
95
100
public NumMatrix (int [][] matrix ) {
96
101
int m = matrix. length, n = matrix[0 ]. length;
97
- pre = new int [m + 1 ][n + 1 ];
98
- for (int i = 1 ; i <= m; ++ i) {
99
- for (int j = 1 ; j <= n; ++ j) {
100
- pre[i ][j] = pre [i - 1 ][j] + pre [i][j - 1 ] - pre[i - 1 ][j - 1 ] + matrix[i - 1 ][j - 1 ];
102
+ s = new int [m + 1 ][n + 1 ];
103
+ for (int i = 0 ; i < m; ++ i) {
104
+ for (int j = 0 ; j < n; ++ j) {
105
+ s[i + 1 ][j + 1 ] = s [i + 1 ][j] + s [i][j + 1 ] - s[i ][j] + matrix[i][j];
101
106
}
102
107
}
103
108
}
104
109
105
110
public int sumRegion (int row1 , int col1 , int row2 , int col2 ) {
106
- return pre [row2 + 1 ][col2 + 1 ] - pre [row2 + 1 ][col1] - pre [row1][col2 + 1 ] + pre [row1][col1];
111
+ return s [row2 + 1 ][col2 + 1 ] - s [row2 + 1 ][col1] - s [row1][col2 + 1 ] + s [row1][col1];
107
112
}
108
113
}
109
114
@@ -119,20 +124,22 @@ class NumMatrix {
119
124
``` cpp
120
125
class NumMatrix {
121
126
public:
122
- vector<vector<int >> pre ;
127
+ vector<vector<int >> s ;
123
128
124
129
NumMatrix(vector<vector<int>>& matrix) {
125
130
int m = matrix.size(), n = matrix[0].size();
126
- pre.resize(m + 1, vector<int>(n + 1));
127
- for (int i = 1; i <= m; ++i) {
128
- for (int j = 1; j <= n; ++j) {
129
- pre[i][j] = pre[i - 1][j] + pre[i][j - 1] - pre[i - 1][j - 1] + matrix[i - 1][j - 1];
131
+ s.resize(m + 1, vector<int>(n + 1));
132
+ for (int i = 0; i < m; ++i)
133
+ {
134
+ for (int j = 0; j < n; ++j)
135
+ {
136
+ s[i + 1][j + 1] = s[i + 1][j] + s[i][j + 1] - s[i][j] + matrix[i][j];
130
137
}
131
138
}
132
139
}
133
140
134
141
int sumRegion (int row1, int col1, int row2, int col2) {
135
- return pre [ row2 + 1] [ col2 + 1 ] - pre [ row2 + 1] [ col1 ] - pre [ row1] [ col2 + 1 ] + pre [ row1] [ col1 ] ;
142
+ return s [ row2 + 1] [ col2 + 1 ] - s [ row2 + 1] [ col1 ] - s [ row1] [ col2 + 1 ] + s [ row1] [ col1 ] ;
136
143
}
137
144
};
138
145
@@ -147,25 +154,25 @@ public:
147
154
148
155
```go
149
156
type NumMatrix struct {
150
- pre [][]int
157
+ s [][]int
151
158
}
152
159
153
160
func Constructor(matrix [][]int) NumMatrix {
154
161
m, n := len(matrix), len(matrix[0])
155
- pre := make([][]int, m+1)
156
- for i := 0; i < m+1; i++ {
157
- pre [i] = make([]int, n+1)
162
+ s := make([][]int, m+1)
163
+ for i := range s {
164
+ s [i] = make([]int, n+1)
158
165
}
159
- for i := 1; i < m+1; i++ {
160
- for j := 1; j < n+1; j++ {
161
- pre[i ][j] = pre[i- 1][j] + pre [i][j- 1] + -pre[i-1 ][j-1 ] + matrix[i-1][j-1]
166
+ for i, row := range matrix {
167
+ for j, v := range row {
168
+ s[i+1 ][j+1 ] = s[i+ 1][j] + s [i][j+ 1] - s[i ][j] + v
162
169
}
163
170
}
164
- return NumMatrix{pre }
171
+ return NumMatrix{s }
165
172
}
166
173
167
174
func (this *NumMatrix) SumRegion(row1 int, col1 int, row2 int, col2 int) int {
168
- return this.pre [row2+1][col2+1] - this.pre [row2+1][col1] - this.pre [row1][col2+1] + this.pre [row1][col1]
175
+ return this.s [row2+1][col2+1] - this.s [row2+1][col1] - this.s [row1][col2+1] + this.s [row1][col1]
169
176
}
170
177
171
178
/**
@@ -175,6 +182,50 @@ func (this *NumMatrix) SumRegion(row1 int, col1 int, row2 int, col2 int) int {
175
182
*/
176
183
```
177
184
185
+ ### ** JavaScript**
186
+
187
+ ``` js
188
+ /**
189
+ * @param {number[][]} matrix
190
+ */
191
+ var NumMatrix = function (matrix ) {
192
+ const m = matrix .length ;
193
+ const n = matrix[0 ].length ;
194
+ this .s = new Array (m + 1 ).fill (0 ).map (() => new Array (n + 1 ).fill (0 ));
195
+ for (let i = 0 ; i < m; ++ i) {
196
+ for (let j = 0 ; j < n; ++ j) {
197
+ this .s [i + 1 ][j + 1 ] =
198
+ this .s [i + 1 ][j] +
199
+ this .s [i][j + 1 ] -
200
+ this .s [i][j] +
201
+ matrix[i][j];
202
+ }
203
+ }
204
+ };
205
+
206
+ /**
207
+ * @param {number} row1
208
+ * @param {number} col1
209
+ * @param {number} row2
210
+ * @param {number} col2
211
+ * @return {number}
212
+ */
213
+ NumMatrix .prototype .sumRegion = function (row1 , col1 , row2 , col2 ) {
214
+ return (
215
+ this .s [row2 + 1 ][col2 + 1 ] -
216
+ this .s [row2 + 1 ][col1] -
217
+ this .s [row1][col2 + 1 ] +
218
+ this .s [row1][col1]
219
+ );
220
+ };
221
+
222
+ /**
223
+ * Your NumMatrix object will be instantiated and called as such:
224
+ * var obj = new NumMatrix(matrix)
225
+ * var param_1 = obj.sumRegion(row1,col1,row2,col2)
226
+ */
227
+ ```
228
+
178
229
### ** ...**
179
230
180
231
```
0 commit comments