Skip to content

Commit 0bc7115

Browse files
committed
feat: add solutions to lc problem: No.0304. Range Sum Query 2D - Immutable
1 parent 21b2939 commit 0bc7115

File tree

8 files changed

+220
-59
lines changed

8 files changed

+220
-59
lines changed

README.md

+1
Original file line numberDiff line numberDiff line change
@@ -188,6 +188,7 @@
188188
- [下降路径最小和](./solution/0900-0999/0931.Minimum%20Falling%20Path%20Sum/README.md)
189189
- [三角形最小路径和](./solution/0100-0199/0120.Triangle/README.md)
190190
- [矩阵区域和](./solution/1300-1399/1314.Matrix%20Block%20Sum/README.md)
191+
- [二维区域和检索 - 矩阵不可变](./solution/0300-0399/0304.Range%20Sum%20Query%202D%20-%20Immutable/README.md)
191192
- [礼物的最大价值](./lcof/面试题47.%20礼物的最大价值/README.md)
192193
- [最小路径和](./solution/0000-0099/0064.Minimum%20Path%20Sum/README.md)
193194
- [最长上升子序列](./solution/0300-0399/0300.Longest%20Increasing%20Subsequence/README.md)

README_EN.md

+1
Original file line numberDiff line numberDiff line change
@@ -182,6 +182,7 @@ Complete solutions to [LeetCode](https://leetcode.com/problemset/all/), [LCOF](h
182182
- [Minimum Falling Path Sum](./solution/0900-0999/0931.Minimum%20Falling%20Path%20Sum/README_EN.md)
183183
- [Triangle](./solution/0100-0199/0120.Triangle/README_EN.md)
184184
- [Matrix Block Sum](./solution/1300-1399/1314.Matrix%20Block%20Sum/README_EN.md)
185+
- [Range Sum Query 2D - Immutable](./solution/0300-0399/0304.Range%20Sum%20Query%202D%20-%20Immutable/README_EN.md)
185186
- [Minimum Path Sum](./solution/0000-0099/0064.Minimum%20Path%20Sum/README_EN.md)
186187
- [Longest Increasing Subsequence](./solution/0300-0399/0300.Longest%20Increasing%20Subsequence/README_EN.md)
187188
- [Russian Doll Envelopes](./solution/0300-0399/0354.Russian%20Doll%20Envelopes/README_EN.md)

solution/0300-0399/0304.Range Sum Query 2D - Immutable/README.md

+77-20
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,8 @@ sumRegion(1, 2, 2, 4) -> 12
4444

4545
<!-- 这里可写通用的实现逻辑 -->
4646

47+
动态规划-二维前缀和。
48+
4749
<!-- tabs:start -->
4850

4951
### **Python3**
@@ -54,17 +56,14 @@ sumRegion(1, 2, 2, 4) -> 12
5456
class NumMatrix:
5557

5658
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]
6564

6665
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]
6867

6968

7069
# Your NumMatrix object will be instantiated and called as such:
@@ -78,23 +77,20 @@ class NumMatrix:
7877

7978
```java
8079
class NumMatrix {
81-
private int[][] sums;
80+
private int[][] pre;
8281

8382
public NumMatrix(int[][] matrix) {
84-
int m = matrix.length;
85-
if (m > 0) {
86-
int n = matrix[0].length;
87-
sums = new int[m + 1][n + 1];
88-
for (int i = 0; i < m; ++i) {
89-
for (int j = 0; j < n; ++j) {
90-
sums[i + 1][j + 1] = sums[i][j + 1] + sums[i + 1][j] - sums[i][j] + matrix[i][j];
91-
}
83+
int m = matrix.length, n = matrix[0].length;
84+
pre = new int[m + 1][n + 1];
85+
for (int i = 1; i <= m; ++i) {
86+
for (int j = 1; j <= n; ++j) {
87+
pre[i][j] = pre[i - 1][j] + pre[i][j - 1] - pre[i - 1][j - 1] + matrix[i - 1][j - 1];
9288
}
9389
}
9490
}
95-
91+
9692
public int sumRegion(int row1, int col1, int row2, int col2) {
97-
return sums[row2 + 1][col2 + 1] - sums[row2 + 1][col1] - sums[row1][col2 + 1] + sums[row1][col1];
93+
return pre[row2 + 1][col2 + 1] - pre[row2 + 1][col1] - pre[row1][col2 + 1] + pre[row1][col1];
9894
}
9995
}
10096

@@ -105,6 +101,67 @@ class NumMatrix {
105101
*/
106102
```
107103

104+
### **C++**
105+
106+
```cpp
107+
class NumMatrix {
108+
public:
109+
vector<vector<int>> pre;
110+
111+
NumMatrix(vector<vector<int>>& matrix) {
112+
int m = matrix.size(), n = matrix[0].size();
113+
pre.resize(m + 1, vector<int>(n + 1));
114+
for (int i = 1; i <= m; ++i) {
115+
for (int j = 1; j <= n; ++j) {
116+
pre[i][j] = pre[i - 1][j] + pre[i][j - 1] - pre[i - 1][j - 1] + matrix[i - 1][j - 1];
117+
}
118+
}
119+
}
120+
121+
int sumRegion(int row1, int col1, int row2, int col2) {
122+
return pre[row2 + 1][col2 + 1] - pre[row2 + 1][col1] - pre[row1][col2 + 1] + pre[row1][col1];
123+
}
124+
};
125+
126+
/**
127+
* Your NumMatrix object will be instantiated and called as such:
128+
* NumMatrix* obj = new NumMatrix(matrix);
129+
* int param_1 = obj->sumRegion(row1,col1,row2,col2);
130+
*/
131+
```
132+
133+
### **C++**
134+
135+
```cpp
136+
type NumMatrix struct {
137+
pre [][]int
138+
}
139+
140+
func Constructor(matrix [][]int) NumMatrix {
141+
m, n := len(matrix), len(matrix[0])
142+
pre := make([][]int, m+1)
143+
for i := 0; i < m+1; i++ {
144+
pre[i] = make([]int, n+1)
145+
}
146+
for i := 1; i < m+1; i++ {
147+
for j := 1; j < n+1; j++ {
148+
pre[i][j] = pre[i-1][j] + pre[i][j-1] + -pre[i-1][j-1] + matrix[i-1][j-1]
149+
}
150+
}
151+
return NumMatrix{pre}
152+
}
153+
154+
func (this *NumMatrix) SumRegion(row1 int, col1 int, row2 int, col2 int) int {
155+
return this.pre[row2+1][col2+1] - this.pre[row2+1][col1] - this.pre[row1][col2+1] + this.pre[row1][col1]
156+
}
157+
158+
/**
159+
* Your NumMatrix object will be instantiated and called as such:
160+
* obj := Constructor(matrix);
161+
* param_1 := obj.SumRegion(row1,col1,row2,col2);
162+
*/
163+
```
164+
108165
### **...**
109166

110167
```

solution/0300-0399/0304.Range Sum Query 2D - Immutable/README_EN.md

+77-20
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,8 @@ numMatrix.sumRegion(1, 2, 2, 4); // return 12 (i.e sum of the blue rectangele).
4646

4747
## Solutions
4848

49+
Dynamic programming - 2D preSum.
50+
4951
<!-- tabs:start -->
5052

5153
### **Python3**
@@ -54,17 +56,14 @@ numMatrix.sumRegion(1, 2, 2, 4); // return 12 (i.e sum of the blue rectangele).
5456
class NumMatrix:
5557

5658
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]
6564

6665
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]
6867

6968

7069
# Your NumMatrix object will be instantiated and called as such:
@@ -76,23 +75,20 @@ class NumMatrix:
7675

7776
```java
7877
class NumMatrix {
79-
private int[][] sums;
78+
private int[][] pre;
8079

8180
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];
9086
}
9187
}
9288
}
93-
89+
9490
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];
9692
}
9793
}
9894

@@ -103,6 +99,67 @@ class NumMatrix {
10399
*/
104100
```
105101

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+
106163
### **...**
107164

108165
```
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
class NumMatrix {
2+
public:
3+
vector<vector<int>> pre;
4+
5+
NumMatrix(vector<vector<int>>& matrix) {
6+
int m = matrix.size(), n = matrix[0].size();
7+
pre.resize(m + 1, vector<int>(n + 1));
8+
for (int i = 1; i <= m; ++i) {
9+
for (int j = 1; j <= n; ++j) {
10+
pre[i][j] = pre[i - 1][j] + pre[i][j - 1] - pre[i - 1][j - 1] + matrix[i - 1][j - 1];
11+
}
12+
}
13+
}
14+
15+
int sumRegion(int row1, int col1, int row2, int col2) {
16+
return pre[row2 + 1][col2 + 1] - pre[row2 + 1][col1] - pre[row1][col2 + 1] + pre[row1][col1];
17+
}
18+
};
19+
20+
/**
21+
* Your NumMatrix object will be instantiated and called as such:
22+
* NumMatrix* obj = new NumMatrix(matrix);
23+
* int param_1 = obj->sumRegion(row1,col1,row2,col2);
24+
*/
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
type NumMatrix struct {
2+
pre [][]int
3+
}
4+
5+
func Constructor(matrix [][]int) NumMatrix {
6+
m, n := len(matrix), len(matrix[0])
7+
pre := make([][]int, m+1)
8+
for i := 0; i < m+1; i++ {
9+
pre[i] = make([]int, n+1)
10+
}
11+
for i := 1; i < m+1; i++ {
12+
for j := 1; j < n+1; j++ {
13+
pre[i][j] = pre[i-1][j] + pre[i][j-1] + -pre[i-1][j-1] + matrix[i-1][j-1]
14+
}
15+
}
16+
return NumMatrix{pre}
17+
}
18+
19+
func (this *NumMatrix) SumRegion(row1 int, col1 int, row2 int, col2 int) int {
20+
return this.pre[row2+1][col2+1] - this.pre[row2+1][col1] - this.pre[row1][col2+1] + this.pre[row1][col1]
21+
}
22+
23+
/**
24+
* Your NumMatrix object will be instantiated and called as such:
25+
* obj := Constructor(matrix);
26+
* param_1 := obj.SumRegion(row1,col1,row2,col2);
27+
*/

solution/0300-0399/0304.Range Sum Query 2D - Immutable/Solution.java

+7-10
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,18 @@
11
class NumMatrix {
2-
private int[][] sums;
2+
private int[][] pre;
33

44
public NumMatrix(int[][] matrix) {
5-
int m = matrix.length;
6-
if (m > 0) {
7-
int n = matrix[0].length;
8-
sums = new int[m + 1][n + 1];
9-
for (int i = 0; i < m; ++i) {
10-
for (int j = 0; j < n; ++j) {
11-
sums[i + 1][j + 1] = sums[i][j + 1] + sums[i + 1][j] - sums[i][j] + matrix[i][j];
12-
}
5+
int m = matrix.length, n = matrix[0].length;
6+
pre = new int[m + 1][n + 1];
7+
for (int i = 1; i <= m; ++i) {
8+
for (int j = 1; j <= n; ++j) {
9+
pre[i][j] = pre[i - 1][j] + pre[i][j - 1] - pre[i - 1][j - 1] + matrix[i - 1][j - 1];
1310
}
1411
}
1512
}
1613

1714
public int sumRegion(int row1, int col1, int row2, int col2) {
18-
return sums[row2 + 1][col2 + 1] - sums[row2 + 1][col1] - sums[row1][col2 + 1] + sums[row1][col1];
15+
return pre[row2 + 1][col2 + 1] - pre[row2 + 1][col1] - pre[row1][col2 + 1] + pre[row1][col1];
1916
}
2017
}
2118

solution/0300-0399/0304.Range Sum Query 2D - Immutable/Solution.py

+6-9
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,14 @@
11
class NumMatrix:
22

33
def __init__(self, matrix: List[List[int]]):
4-
m = len(matrix)
5-
if m > 0:
6-
n = len(matrix[0])
7-
self.sums = [[0] * (n + 1) for _ in range(m + 1)]
8-
for i in range(m):
9-
for j in range(n):
10-
self.sums[i + 1][j + 1] = self.sums[i][j + 1] + \
11-
self.sums[i + 1][j] - self.sums[i][j] + matrix[i][j]
4+
m, n = len(matrix), len(matrix[0])
5+
self.pre = [[0] * (n + 1) for _ in range(m + 1)]
6+
for i in range(1, m + 1):
7+
for j in range(1, n + 1):
8+
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]
129

1310
def sumRegion(self, row1: int, col1: int, row2: int, col2: int) -> int:
14-
return self.sums[row2 + 1][col2 + 1] - self.sums[row2 + 1][col1] - self.sums[row1][col2 + 1] + self.sums[row1][col1]
11+
return self.pre[row2 + 1][col2 + 1] - self.pre[row2 + 1][col1] - self.pre[row1][col2 + 1] + self.pre[row1][col1]
1512

1613

1714
# Your NumMatrix object will be instantiated and called as such:

0 commit comments

Comments
 (0)