Skip to content

Commit fb7453f

Browse files
committed
feat: add solutions to lcci problem: No.17.24
No.17.24.Max Submatrix
1 parent f6803e3 commit fb7453f

File tree

6 files changed

+447
-2
lines changed

6 files changed

+447
-2
lines changed

lcci/17.24.Max Submatrix/README.md

+154-1
Original file line numberDiff line numberDiff line change
@@ -31,22 +31,175 @@
3131

3232
<!-- 这里可写通用的实现逻辑 -->
3333

34+
双指针 i1, i2 遍历所有可能的“行对”,即子矩阵的上下两条边,这决定了矩阵的高,然后枚举 i1~i2 高度的每一列,看成一维数组的一项,求和最大的子数组即可。
35+
3436
<!-- tabs:start -->
3537

3638
### **Python3**
3739

3840
<!-- 这里可写当前语言的特殊实现逻辑 -->
3941

4042
```python
41-
43+
class Solution:
44+
def getMaxMatrix(self, matrix: List[List[int]]) -> List[int]:
45+
m, n = len(matrix), len(matrix[0])
46+
s = [[0] * n for _ in range(m + 1)]
47+
for i in range(m):
48+
for j in range(n):
49+
# 构造列前缀和
50+
s[i + 1][j] = s[i][j] + matrix[i][j]
51+
52+
mx = matrix[0][0]
53+
ans = [0, 0, 0, 0]
54+
for i1 in range(m):
55+
for i2 in range(i1, m):
56+
nums = [0] * n
57+
for j in range(n):
58+
nums[j] = s[i2 + 1][j] - s[i1][j]
59+
60+
start = 0
61+
f = nums[0]
62+
for j in range(1, n):
63+
if f > 0:
64+
f += nums[j]
65+
else:
66+
f = nums[j]
67+
start = j
68+
if f > mx:
69+
mx = f
70+
ans = [i1, start, i2, j]
71+
return ans
4272
```
4373

4474
### **Java**
4575

4676
<!-- 这里可写当前语言的特殊实现逻辑 -->
4777

4878
```java
79+
class Solution {
80+
public int[] getMaxMatrix(int[][] matrix) {
81+
int m = matrix.length, n = matrix[0].length;
82+
int[][] s = new int[m + 1][n];
83+
for (int i = 0; i < m; ++i) {
84+
for (int j = 0; j < n; ++j) {
85+
s[i + 1][j] = s[i][j] + matrix[i][j];
86+
}
87+
}
88+
int mx = matrix[0][0];
89+
int[] ans = new int[]{0, 0, 0, 0};
90+
for (int i1 = 0; i1 < m; ++i1) {
91+
for (int i2 = i1; i2 < m; ++i2) {
92+
int[] nums = new int[n];
93+
for (int j = 0; j < n; ++j) {
94+
nums[j] = s[i2 + 1][j] - s[i1][j];
95+
}
96+
int start = 0;
97+
int f = nums[0];
98+
for (int j = 1; j < n; ++j) {
99+
if (f > 0) {
100+
f += nums[j];
101+
} else {
102+
f = nums[j];
103+
start = j;
104+
}
105+
if (f > mx) {
106+
mx = f;
107+
ans = new int[]{i1, start, i2, j};
108+
}
109+
}
110+
}
111+
}
112+
return ans;
113+
}
114+
}
115+
```
116+
117+
### **C++**
118+
119+
```cpp
120+
class Solution {
121+
public:
122+
vector<int> getMaxMatrix(vector<vector<int>>& matrix) {
123+
int m = matrix.size(), n = matrix[0].size();
124+
vector<vector<int>> s(m + 1, vector<int>(n));
125+
for (int i = 0; i < m; ++i)
126+
for (int j = 0; j < n; ++j)
127+
s[i + 1][j] = s[i][j] + matrix[i][j];
128+
int mx = matrix[0][0];
129+
vector<int> ans(4);
130+
for (int i1 = 0; i1 < m; ++i1)
131+
{
132+
for (int i2 = i1; i2 < m; ++i2)
133+
{
134+
vector<int> nums;
135+
for (int j = 0; j < n; ++j)
136+
nums.push_back(s[i2 + 1][j] - s[i1][j]);
137+
int start = 0;
138+
int f = nums[0];
139+
for (int j = 1; j < n; ++j)
140+
{
141+
if (f > 0) f += nums[j];
142+
else
143+
{
144+
f = nums[j];
145+
start = j;
146+
}
147+
if (f > mx)
148+
{
149+
mx = f;
150+
ans[0] = i1;
151+
ans[1] = start;
152+
ans[2] = i2;
153+
ans[3] = j;
154+
}
155+
}
156+
}
157+
}
158+
return ans;
159+
}
160+
};
161+
```
49162
163+
### **Go**
164+
165+
```go
166+
func getMaxMatrix(matrix [][]int) []int {
167+
m, n := len(matrix), len(matrix[0])
168+
s := make([][]int, m+1)
169+
for i := range s {
170+
s[i] = make([]int, n)
171+
}
172+
for i := 0; i < m; i++ {
173+
for j := 0; j < n; j++ {
174+
s[i+1][j] = s[i][j] + matrix[i][j]
175+
}
176+
}
177+
mx := matrix[0][0]
178+
ans := make([]int, 4)
179+
for i1 := 0; i1 < m; i1++ {
180+
for i2 := i1; i2 < m; i2++ {
181+
var nums []int
182+
for j := 0; j < n; j++ {
183+
nums = append(nums, s[i2+1][j]-s[i1][j])
184+
}
185+
start := 0
186+
f := nums[0]
187+
for j := 1; j < n; j++ {
188+
if f > 0 {
189+
f += nums[j]
190+
} else {
191+
f = nums[j]
192+
start = j
193+
}
194+
if f > mx {
195+
mx = f
196+
ans = []int{i1, start, i2, j}
197+
}
198+
}
199+
}
200+
}
201+
return ans
202+
}
50203
```
51204

52205
### **...**

lcci/17.24.Max Submatrix/README_EN.md

+151-1
Original file line numberDiff line numberDiff line change
@@ -39,13 +39,163 @@
3939
### **Python3**
4040

4141
```python
42-
42+
class Solution:
43+
def getMaxMatrix(self, matrix: List[List[int]]) -> List[int]:
44+
m, n = len(matrix), len(matrix[0])
45+
s = [[0] * n for _ in range(m + 1)]
46+
for i in range(m):
47+
for j in range(n):
48+
s[i + 1][j] = s[i][j] + matrix[i][j]
49+
50+
mx = matrix[0][0]
51+
ans = [0, 0, 0, 0]
52+
for i1 in range(m):
53+
for i2 in range(i1, m):
54+
nums = [0] * n
55+
for j in range(n):
56+
nums[j] = s[i2 + 1][j] - s[i1][j]
57+
58+
start = 0
59+
f = nums[0]
60+
for j in range(1, n):
61+
if f > 0:
62+
f += nums[j]
63+
else:
64+
f = nums[j]
65+
start = j
66+
if f > mx:
67+
mx = f
68+
ans = [i1, start, i2, j]
69+
return ans
4370
```
4471

4572
### **Java**
4673

4774
```java
75+
class Solution {
76+
public int[] getMaxMatrix(int[][] matrix) {
77+
int m = matrix.length, n = matrix[0].length;
78+
int[][] s = new int[m + 1][n];
79+
for (int i = 0; i < m; ++i) {
80+
for (int j = 0; j < n; ++j) {
81+
s[i + 1][j] = s[i][j] + matrix[i][j];
82+
}
83+
}
84+
int mx = matrix[0][0];
85+
int[] ans = new int[]{0, 0, 0, 0};
86+
for (int i1 = 0; i1 < m; ++i1) {
87+
for (int i2 = i1; i2 < m; ++i2) {
88+
int[] nums = new int[n];
89+
for (int j = 0; j < n; ++j) {
90+
nums[j] = s[i2 + 1][j] - s[i1][j];
91+
}
92+
int start = 0;
93+
int f = nums[0];
94+
for (int j = 1; j < n; ++j) {
95+
if (f > 0) {
96+
f += nums[j];
97+
} else {
98+
f = nums[j];
99+
start = j;
100+
}
101+
if (f > mx) {
102+
mx = f;
103+
ans = new int[]{i1, start, i2, j};
104+
}
105+
}
106+
}
107+
}
108+
return ans;
109+
}
110+
}
111+
```
112+
113+
### **C++**
114+
115+
```cpp
116+
class Solution {
117+
public:
118+
vector<int> getMaxMatrix(vector<vector<int>>& matrix) {
119+
int m = matrix.size(), n = matrix[0].size();
120+
vector<vector<int>> s(m + 1, vector<int>(n));
121+
for (int i = 0; i < m; ++i)
122+
for (int j = 0; j < n; ++j)
123+
s[i + 1][j] = s[i][j] + matrix[i][j];
124+
int mx = matrix[0][0];
125+
vector<int> ans(4);
126+
for (int i1 = 0; i1 < m; ++i1)
127+
{
128+
for (int i2 = i1; i2 < m; ++i2)
129+
{
130+
vector<int> nums;
131+
for (int j = 0; j < n; ++j)
132+
nums.push_back(s[i2 + 1][j] - s[i1][j]);
133+
int start = 0;
134+
int f = nums[0];
135+
for (int j = 1; j < n; ++j)
136+
{
137+
if (f > 0) f += nums[j];
138+
else
139+
{
140+
f = nums[j];
141+
start = j;
142+
}
143+
if (f > mx)
144+
{
145+
mx = f;
146+
ans[0] = i1;
147+
ans[1] = start;
148+
ans[2] = i2;
149+
ans[3] = j;
150+
}
151+
}
152+
}
153+
}
154+
return ans;
155+
}
156+
};
157+
```
48158
159+
### **Go**
160+
161+
```go
162+
func getMaxMatrix(matrix [][]int) []int {
163+
m, n := len(matrix), len(matrix[0])
164+
s := make([][]int, m+1)
165+
for i := range s {
166+
s[i] = make([]int, n)
167+
}
168+
for i := 0; i < m; i++ {
169+
for j := 0; j < n; j++ {
170+
s[i+1][j] = s[i][j] + matrix[i][j]
171+
}
172+
}
173+
mx := matrix[0][0]
174+
ans := make([]int, 4)
175+
for i1 := 0; i1 < m; i1++ {
176+
for i2 := i1; i2 < m; i2++ {
177+
var nums []int
178+
for j := 0; j < n; j++ {
179+
nums = append(nums, s[i2+1][j]-s[i1][j])
180+
}
181+
start := 0
182+
f := nums[0]
183+
for j := 1; j < n; j++ {
184+
if f > 0 {
185+
f += nums[j]
186+
} else {
187+
f = nums[j]
188+
start = j
189+
}
190+
if f > mx {
191+
mx = f
192+
ans = []int{i1, start, i2, j}
193+
}
194+
}
195+
}
196+
}
197+
return ans
198+
}
49199
```
50200

51201
### **...**

lcci/17.24.Max Submatrix/Solution.cpp

+41
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
class Solution {
2+
public:
3+
vector<int> getMaxMatrix(vector<vector<int>>& matrix) {
4+
int m = matrix.size(), n = matrix[0].size();
5+
vector<vector<int>> s(m + 1, vector<int>(n));
6+
for (int i = 0; i < m; ++i)
7+
for (int j = 0; j < n; ++j)
8+
s[i + 1][j] = s[i][j] + matrix[i][j];
9+
int mx = matrix[0][0];
10+
vector<int> ans(4);
11+
for (int i1 = 0; i1 < m; ++i1)
12+
{
13+
for (int i2 = i1; i2 < m; ++i2)
14+
{
15+
vector<int> nums;
16+
for (int j = 0; j < n; ++j)
17+
nums.push_back(s[i2 + 1][j] - s[i1][j]);
18+
int start = 0;
19+
int f = nums[0];
20+
for (int j = 1; j < n; ++j)
21+
{
22+
if (f > 0) f += nums[j];
23+
else
24+
{
25+
f = nums[j];
26+
start = j;
27+
}
28+
if (f > mx)
29+
{
30+
mx = f;
31+
ans[0] = i1;
32+
ans[1] = start;
33+
ans[2] = i2;
34+
ans[3] = j;
35+
}
36+
}
37+
}
38+
}
39+
return ans;
40+
}
41+
};

0 commit comments

Comments
 (0)