@@ -46,6 +46,8 @@ numMatrix.sumRegion(1, 2, 2, 4); // return 12 (i.e sum of the blue rectangele).
46
46
47
47
## Solutions
48
48
49
+ Dynamic programming - 2D preSum.
50
+
49
51
<!-- tabs:start -->
50
52
51
53
### ** Python3**
@@ -54,17 +56,14 @@ numMatrix.sumRegion(1, 2, 2, 4); // return 12 (i.e sum of the blue rectangele).
54
56
class NumMatrix :
55
57
56
58
def __init__ (self , matrix : List[List[int ]]):
57
- m = len (matrix)
58
- if m > 0 :
59
- n = len (matrix[0 ])
60
- self .sums = [[0 ] * (n + 1 ) for _ in range (m + 1 )]
61
- for i in range (m):
62
- for j in range (n):
63
- self .sums[i + 1 ][j + 1 ] = self .sums[i][j + 1 ] + \
64
- self .sums[i + 1 ][j] - self .sums[i][j] + matrix[i][j]
59
+ m, n = len (matrix), len (matrix[0 ])
60
+ self .pre = [[0 ] * (n + 1 ) for _ in range (m + 1 )]
61
+ for i in range (1 , m + 1 ):
62
+ for j in range (1 , n + 1 ):
63
+ 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 ]
65
64
66
65
def sumRegion (self , row1 : int , col1 : int , row2 : int , col2 : int ) -> int :
67
- return self .sums [row2 + 1 ][col2 + 1 ] - self .sums [row2 + 1 ][col1] - self .sums [row1][col2 + 1 ] + self .sums [row1][col1]
66
+ return self .pre [row2 + 1 ][col2 + 1 ] - self .pre [row2 + 1 ][col1] - self .pre [row1][col2 + 1 ] + self .pre [row1][col1]
68
67
69
68
70
69
# Your NumMatrix object will be instantiated and called as such:
@@ -76,23 +75,20 @@ class NumMatrix:
76
75
77
76
``` java
78
77
class NumMatrix {
79
- private int [][] sums ;
78
+ private int [][] pre ;
80
79
81
80
public NumMatrix (int [][] matrix ) {
82
- int m = matrix. length;
83
- if (m > 0 ) {
84
- int n = matrix[0 ]. length;
85
- sums = new int [m + 1 ][n + 1 ];
86
- for (int i = 0 ; i < m; ++ i) {
87
- for (int j = 0 ; j < n; ++ j) {
88
- sums[i + 1 ][j + 1 ] = sums[i][j + 1 ] + sums[i + 1 ][j] - sums[i][j] + matrix[i][j];
89
- }
81
+ int m = matrix. length, n = matrix[0 ]. length;
82
+ pre = new int [m + 1 ][n + 1 ];
83
+ for (int i = 1 ; i <= m; ++ i) {
84
+ for (int j = 1 ; j <= n; ++ j) {
85
+ pre[i][j] = pre[i - 1 ][j] + pre[i][j - 1 ] - pre[i - 1 ][j - 1 ] + matrix[i - 1 ][j - 1 ];
90
86
}
91
87
}
92
88
}
93
-
89
+
94
90
public int sumRegion (int row1 , int col1 , int row2 , int col2 ) {
95
- return sums [row2 + 1 ][col2 + 1 ] - sums [row2 + 1 ][col1] - sums [row1][col2 + 1 ] + sums [row1][col1];
91
+ return pre [row2 + 1 ][col2 + 1 ] - pre [row2 + 1 ][col1] - pre [row1][col2 + 1 ] + pre [row1][col1];
96
92
}
97
93
}
98
94
@@ -103,6 +99,67 @@ class NumMatrix {
103
99
*/
104
100
```
105
101
102
+ ### ** C++**
103
+
104
+ ``` cpp
105
+ class NumMatrix {
106
+ public:
107
+ vector<vector<int >> pre;
108
+
109
+ NumMatrix(vector<vector<int>>& matrix) {
110
+ int m = matrix.size(), n = matrix[0].size();
111
+ pre.resize(m + 1, vector<int>(n + 1));
112
+ for (int i = 1; i <= m; ++i) {
113
+ for (int j = 1; j <= n; ++j) {
114
+ pre[i][j] = pre[i - 1][j] + pre[i][j - 1] - pre[i - 1][j - 1] + matrix[i - 1][j - 1];
115
+ }
116
+ }
117
+ }
118
+
119
+ int sumRegion (int row1, int col1, int row2, int col2) {
120
+ return pre[ row2 + 1] [ col2 + 1 ] - pre[ row2 + 1] [ col1 ] - pre[ row1] [ col2 + 1 ] + pre[ row1] [ col1 ] ;
121
+ }
122
+ };
123
+
124
+ /**
125
+ * Your NumMatrix object will be instantiated and called as such:
126
+ * NumMatrix* obj = new NumMatrix(matrix);
127
+ * int param_1 = obj->sumRegion(row1,col1,row2,col2);
128
+ * /
129
+ ```
130
+
131
+ ### **C++**
132
+
133
+ ```cpp
134
+ type NumMatrix struct {
135
+ pre [][]int
136
+ }
137
+
138
+ func Constructor(matrix [][]int) NumMatrix {
139
+ m, n := len(matrix), len(matrix[0])
140
+ pre := make([][]int, m+1)
141
+ for i := 0; i < m+1; i++ {
142
+ pre[i] = make([]int, n+1)
143
+ }
144
+ for i := 1; i < m+1; i++ {
145
+ for j := 1; j < n+1; j++ {
146
+ pre[i][j] = pre[i-1][j] + pre[i][j-1] + -pre[i-1][j-1] + matrix[i-1][j-1]
147
+ }
148
+ }
149
+ return NumMatrix{pre}
150
+ }
151
+
152
+ func (this *NumMatrix) SumRegion(row1 int, col1 int, row2 int, col2 int) int {
153
+ return this.pre[row2+1][col2+1] - this.pre[row2+1][col1] - this.pre[row1][col2+1] + this.pre[row1][col1]
154
+ }
155
+
156
+ /**
157
+ * Your NumMatrix object will be instantiated and called as such:
158
+ * obj := Constructor(matrix);
159
+ * param_1 := obj.SumRegion(row1,col1,row2,col2);
160
+ */
161
+ ```
162
+
106
163
### ** ...**
107
164
108
165
```
0 commit comments